我有幾個關於類裝載機的問題。使用了什麼類加載器?
Class.forName("class.name");
和
....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
什麼類加載器將在每種情況下可以使用?對於第一種情況,我假設用於加載類方法代碼正在執行的類加載器。而在第二種情況下,我假設線程上下文類加載器。
如果我錯了,我會讚賞一個小小的解釋。
我有幾個關於類裝載機的問題。使用了什麼類加載器?
Class.forName("class.name");
和
....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
什麼類加載器將在每種情況下可以使用?對於第一種情況,我假設用於加載類方法代碼正在執行的類加載器。而在第二種情況下,我假設線程上下文類加載器。
如果我錯了,我會讚賞一個小小的解釋。
兩者都使用當前的ClassLoader
。正如DNA正確指出的那樣,http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29指出Class.forName()
使用當前的類加載器。一個小實驗表明,加載使用new
聲明實例化一個類也使用當前ClassLoader
:
public class Test
{
public static void main(String[] args) throws Exception
{
Thread.currentThread().setContextClassLoader(new MyClassLoader());
SomeClass someClass = new SomeClass();
someClass.printClassLoader();
}
public static class MyClassLoader extends ClassLoader
{
public MyClassLoader()
{
super();
}
public MyClassLoader(ClassLoader parent)
{
super(parent);
}
}
}
public class SomeClass
{
public void printClassLoader()
{
System.out.println(this.getClass().getClassLoader());
System.out.println(Thread.currentThread().getContextClassLoader());
}
}
在Test
我們當前的線程ContextClassLoader設置爲一些自定義的ClassLoader
然後實例SomeClass
類的對象。在SomeClass
中,我們輸出當前線程的ContextClassLoader和加載該對象類的ClassLoader
。其結果是
[email protected]
[email protected]
指示當前ClassLoader
(sun.misc.Launcher.AppClassLoader
)用於加載類。
「當前的'ClassLoader'」是什麼意思? – jameshfisher 2014-08-26 14:29:11
@jameshfisher「當前班級的定義班級加載器」 – Uli 2014-09-02 07:50:37
「當前班級」是什麼意思?詞彙範圍? – jameshfisher 2014-09-02 08:31:37
請參閱http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29第一種情況(您的假設是正確的)。另請參見[這個問題](http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader)一個很好的解釋。 – DNA 2012-07-25 21:24:09