2011-11-02 65 views
3

可有人請從「核心Java第二卷第八edtion」 759頁解釋了以下段落:什麼是類加載器反轉

您的應用程序代碼包含調用 Class.forName(classNameString)一個輔助方法。

該方法從插件類中調用。

classNameString指定包含在插件 JAR中的類。

插件的作者有合理的期望,應該加載類 。然而,輔助方法的類是由系統類加載器加載的,並且這是由 Class.forName使用的類加載器。插件JAR中的類不可見。這 現象被稱爲類加載器反轉...

從我的理解,如果,那麼插件jar它是必須放在CLASSPATH中的「輔助方法的類是由系統類加載器加載」,並另外如果「classNameString指定了包含在插件JAR中的類」,那麼這兩個類應該都在同一個jar文件中,該文件位於CLASSPATH中,那麼爲什麼「插件JAR中的類不可見」

回答

3

說Helper.class類在core.jar中,它位於CLASSPATH上並由系統類加載器加載。

PluginMain.class和PluginWidget.class在plugin.jar中,但plugin.jar不在CLASSPATH上。

作爲插件系統的一部分,插件創建一個名爲PluginClassLoader的新類加載器,使用它從plugin.jar加載PluginMain.class,並調用PluginMain.start()。

如果PluginMain.start()調用Helper.deluxeLoadClass(「PluginWidget.class」),並且deluxeLoadClass()最終調用Class.forName(「PluginWidget.class」),則發生類加載器反轉。這會失敗,因爲Helper.class由系統類加載器加載,因爲系統類加載器在其類路徑中沒有plugin.jar,所以系統無法看到PluginWidget.class。

該示例有點人爲設想,但這些情況在使用complex class loader hierarchies的J2EE容器中發生得更頻繁。

+0

什麼困惑我的第一個地方是,這讓我相信,輔助方法屬於插件類,閱讀你的答案和visting您發佈的鏈接後「的方法是從插件類稱爲」,一切都變得那麼清晰,非常感謝sbridges – V4Volleyball

2

這是從舊的萬維書爲Java平臺組件開發(我實際上仍然推薦)轉述。

應用程序的Main類可以引用java.lang.String,儘管Main來自classpath類加載器,而String來自引導加載程序。

String,然而,不能參考Main,因爲類路徑加載器不是引導加載程序的代表團的一部分。 來自父裝載程序的類無法從子裝載程序引用類。

這和你的例子是一樣的; PluginMain的類加載器可以調用Helper,因爲Helper是由父類加載器加載的。但是Helper無法看到PluginWidget,因爲Widget類是由孩子類加載器加載。

+0

+1覆蓋系統和插件類加載器之間的父子關係。 –

相關問題