Question

Il semble que tout le monde a eu une brosse désagréable avec le service Java fournisseur , cette chose que vous pouvez faire avec un fichier nommé comme META-INF / services / com.example.Interface, mais que personne ne l'utilise, sauf pour essayer de charger l'analyseur XML droit. Je suis en train de travailler avec une bibliothèque qui utilise l'API de fournisseur de services, et bidouiller pour que je puisse fournir des cours d'exécution, étendu (en utilisant cglib) qui ne mettent pas en œuvre effectivement l'interface, mais peut être fait pour le faire facilement.

En fait, je pense que les étapes que je dois effectuer sont:

  1. Créer un chargeur de classe personnalisée qui répondra à getResources (...) et renvoyer une URL « supplémentaire »
  2. ont également que le crochet de chargeur de classe getResourceAsStream (...) pour retourner une liste des classes que je vais manipuler avec cglib, lorsqu'on lui a demandé de la ressource « supplémentaire »
  3. Enfin, ont ce chargeur de classe charge ces classes sur demande

Mais voici où je suis perdu. Par exemple, lorsque la bibliothèque tente de déterminer ce que sont implémenteurs là-bas, il appelle getResources (...) qui retourne un tas d'URL. Mais getResourceAsStream (...) ne prend pas les URL, il faut des « noms ». Les noms qui semblent être classpath-parent, et donc les mêmes partout. Donc, META-INF / services / com.example.Interface en a le même "nom" comme META-INF / services / com.example.Interface dans leur JAR, non? Sauf en quelque sorte cela fonctionne avec les parseurs XML sablée ...

Bien sûr, tout cela suppose qu'ils étaient assez intelligents / genre pour appeler ClassLoader.getSystemClassLoader () plutôt que d'utiliser ClassLoader.getSystemResources (...), ClassLoader.getSystemResourceAsStream (...), etc., comme dans le ce dernier cas, il n'y a aucun moyen de brancher le chargeur de classe et de fournir le fichier truquée.

Je suppose que dans ce cas, je pourrais utiliser BCEL pour manipuler les fichiers de classe lorsque mon code est emballé par Maven, plutôt que d'attendre jusqu'à ce que l'exécution de le faire avec cglib?

Était-ce utile?

La solution

L'idée que décrit était le long de la bonne voie. L'erreur que je faisais était de penser que l'utilisation ClassLoader.getResourceAsStream(..) pour accéder au contenu des URL. , Vous devriez plutôt que URL.openStream().

Si je trouvé avant de poster, java.util.ServiceLoader (@since 1.6) donne un aperçu de la façon de faire les choses correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top