2009-07-03 37 views
2

我有一個名爲「MyClassLoader」的URLClassLoader,它設置了一些jar。 如果我嘗試在運行時加載.jars:我的加載程序工作,但使用setContextClassLoader不?

MyClassLoader.loadClass("MyClass"); 

它的工作原理。

如果我嘗試

Thread.currentThread().setContextClassLoader(MyClassLoader); 
Thread.currentThread().getContextClassLoader().loadClass("MyClass"); 

它也適用。

但如果我嘗試

Thread.currentThread().setContextClassLoader(MyClassLoader); 
Class.forName("MyClass"); 

它拋出一個ClassNotFoundException

當然,Class.forName這裏只是一個例子;試圖使用MyClass也會拋出異常。

所有這可能意味着我不明白setContextClassLoader如何工作。任何人都可以向我澄清這一點,並幫助我理解它 - 我該怎麼做才能讓我的代碼工作?謝謝。

回答

3

公共靜態類的forName(字符串的className) 拋出ClassNotFoundException的

返回與類或接口與給定字符串名稱相關聯的類對象。調用此方法相當於:

Class.forName(className,true,currentLoader) 其中currentLoader表示當前類的定義類加載器。

嘗試:

Class.forName("MyClass", true, MyClassLoader); 

[的Class.forName(字符串,布爾,類加載器] [1]

您所遇到的可能的問題是你想的forName一類,你加載了一個自定義的ClassLoader,但是,你使用的是forName形式,它隱式地使用加載了調用Class的ClassLoader,在大多數情況下,這將是系統ClassLoader。 rs可能變得複雜。

[1]:http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String,布爾型,java.lang.ClassLoader的)

+0

是的,是的Class.forName中的安全編碼指南部6列爲出現異常行爲依賴於呼叫者的類加載器的那些方法之一。不是那些依賴線程上下文類加載器的方法更好。聰明的事情是明確使用類加載器。 – 2009-07-03 10:57:18

相關問題