2011-09-27 110 views
0

this question,它可以從一個jar文件中加載類:如何在運行時加載所有類的jar文件?

ClassLoader loader = URLClassLoader.newInstance(
    new URL[] { jarFileURL }, 
    getClass().getClassLoader() 
); 
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader); 

如何加載包含在一個jar文件中的所有類?

+2

你爲什麼要這樣做? – mcfinnigan

+0

不成熟的優化?無法容忍代碼的關鍵部分的延遲?無論如何,在這種情況下,最好在關鍵部分之前製作每個「關鍵」部分的對象。 –

+0

下面是一個實際的用例:如果你編寫一個像getdown(http://code.google.com/p/getdown/)這樣的更新工具,並且替換你自己的jar(忽略這可能有點脆弱),那麼這個類我們嘗試的加載器無法加載新類(因爲文件句柄可能無效)。如果我們預先加載所有需要更新的結束的類,那麼我們很好。 – mringwal

回答

3

類加載器將在需要時立即加載.class文件。如果不需要,它將不會被加載。

爲什麼你認爲你的方法會改進類加載器已經做的?

+0

「類加載器將在需要時立即加載.class文件」。謝謝(你的)信息。 – julien

+3

回答字面問題的另一個好例子不是一個好主意(+1) –

+4

回答這個問題會更有幫助。這是一個非常有效的方法,例如,在啓動時加載大量用戶創建的插件。 – Nim

0

你將不得不打開它作爲zip文件,通過名稱,假設所有以.class結尾的條目都是類文件並加載它們,忽略嵌套的類等。

但是......爲什麼?

0

如果你真的想要動態地讀取類,留給專業人士,誰已經實現了。實現你自己的類加載器很困難。相信我。我已經嘗試了幾次。改爲使用類似OSGi的東西,它爲您提供動態類加載等等。