Frage

Es scheint, wie jeder eine unangenehme Bürste mit der Java Service Provider , dass, was Sie mit einer Datei wie META-INF / service / com.example.Interface genannt tun können, sondern dass niemand Anwendungen mit Ausnahme versuchen, den richtigen XML-Parser zu laden. Ich versuche, mit einer Bibliothek zu arbeiten, die das Service Provider-API verwendet, und Trick es so, dass ich einige Runtime-erweiterten Klassen zur Verfügung stellen kann (mit cglib), die eigentlich nicht der Schnittstelle implementieren, sondern kann gemacht werden, so leicht zu tun.

Im Grunde denke ich, dass die Schritte, die ich durchführen müssen, sind:

  1. Erstellen Sie eine benutzerdefinierte Class Loader, die GetResources reagieren (...) und geben eine "extra" URL
  2. haben Sie auch, dass Klassenladehaken getResourceAsStream (...) eine Liste der Klassen kehre ich mit cglib manipulieren werde, wenn sie für die „extra“ Ressource gefragt
  3. Schließlich haben, die Klasse loader laden diese Klassen, wenn die angeforderte

Aber hier ist, wo ich verloren gehen. Wenn zum Beispiel die Bibliothek versucht zu bestimmen, was Implementierer sind da draußen, es ruft GetResources (...), die eine Reihe von URLs zurückgibt. Aber getResourceAsStream (...) übernimmt keine URLs, dauert es „Namen“. Namen, die scheinen überall Classpath-relativ, und daher wird das gleiche sein. So META-INF / services / com.example.Interface in den gleichen "name" hat als META-INF / services / com.example.Interface in ihren JAR, nicht wahr? Außer irgendwie diese Werke mit denen gestrahlten XML-Parser ...

Natürlich all dies setzt voraus, sie smart / nett genug zu nennen ClassLoader.getSystemClassLoader () waren eher als ClassLoader.getSystemResources mit (...), ClassLoader.getSystemResourceAsStream (...) usw., wie in der letzteren Fall gibt es keine Möglichkeit, den Classloader anschließen und deren fingierte Datei zur Verfügung stellen.

ich denke, in diesem Fall ich BCEL verwenden könnte die Klassendateien zu manipulieren, wenn mein Code von Maven verpackt wird, anstatt zu warten, bis zur Laufzeit mit cglib zu tun?

War es hilfreich?

Lösung

Die Idee war ich auf der richtigen Spur beschrieben. Der Fehler, den ich machte, war in der Annahme, dass ClassLoader.getResourceAsStream(..) mit dem Inhalt der URLs zuzugreifen. Stattdessen sollten Sie nur URL.openStream().

Hätte ich fand es vor der Veröffentlichung, java.util.ServiceLoader (@since 1.6) bietet einen Einblick in, wie die Dinge richtig zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top