Commencez avec un fichier JAR contenant un fichier texte JAX-WS SPI dans/META-INF, puis la classe vers laquelle il pointe. Mettez-le dans le classpath. Définissez contextClassLoader pour le thread en cours sur null.Lorsque Thread.currentThread(). GetContextClassLoader() renvoie la valeur null, que se passe-t-il?
Appelez la classe Service
à partir de l'API JAX-WS dans JDK 1.6 et commencez à la parcourir. En l'absence d'un chargeur de classe de contexte, ce code appellera des méthodes statiques de Class
pour trouver des choses.
Il trouvera avec succès le fichier SPI. Mais il ne trouvera pas la classe .class qu'elle nomme.
Si vous voulez vraiment essayer par vous-même, prenez Apache CXF 2.2.10, placez-le sur classpath et annulez le chargeur de classe de contexte.
Ce n'était pas un exercice de masochisme inutile: il s'avère que lorsque Open Office appelle une extension Java ('UNO'), il quitte le chargeur de classe de contexte null
. Il a fallu une archéologie significative pour comprendre cela. Ce qui m'a laissé me demander, y a-t-il un bug JDK qui explique les résultats incohérents, ou un comportement spécifié que je ne comprends pas?
On dirait qu'il utilise le chargeur de classe système (inclut les classes classpath) pour charger le fichier de services mais le chargeur de classe bootstrap pour charger la classe. 'grep -R Class.forName. | grep FactoryFinder' est divisé de manière à peu près égale sur lequel choisir (ne pas juste <3 clone-and-own code?). Bien sûr, si le même code était chargé à partir d'autre chose que le système, l'extension ou le chargeur de démarrage, il ne serait même pas capable de se trouver. –
@Tom, eh bien, c'est réconfortant d'être capable de blâmer quelqu'un d'autre. Voulez-vous en faire une réponse pour que je puisse l'accepter? – bmargulies
Quelle est la question? – irreputable