從包含/ META-INF中的JAX-WS SPI文本文件的JAR文件開始,然後指向它所指向的類。把它放到classpath中。將當前線程的contextClassLoader設置爲null。當Thread.currentThread()。getContextClassLoader()返回null時,發生了什麼?
從JDK 1.6中的JAX-WS API調用Service
類,並開始逐步完成。在沒有上下文類加載器的情況下,此代碼將調用Class
的靜態方法來查找事物。
它會成功找到SPI文件。但它不會找到它命名的.class。
如果你真的想爲自己嘗試一下,請抓住Apache CXF 2.2.10,將它放在類路徑中,並清除上下文類加載器。
這不是毫無意義的受虐狂行爲:當Open Office調用Java擴展('UNO')時,它會離開上下文類加載器null
。它考慮了一些重要的考古學方面的知識。這讓我想知道,是否有解決不一致結果的JDK錯誤,或者我不明白的某些特定行爲?
看起來像使用系統類加載器(包括類路徑類)來加載服務文件,但引導類加載器加載類。 'grep -R Class.forName。 | grep FactoryFinder'幾乎可以平均分配到哪個選項上(你不只是<3克隆和自己的代碼?)。當然,如果相同的代碼是從系統,擴展或引導加載程序以外的任何其他代碼加載的,那麼它甚至無法找到它自己。 – 2010-09-19 22:13:18
@Tom,好吧,能夠把這個責任歸咎於別人是令人欣慰的。請注意將其作爲答案,以便我可以接受它? – bmargulies 2010-09-19 23:13:09
有什麼問題? – irreputable 2010-09-20 00:37:32