2012-07-25 70 views
6

我有幾個關於類裝載機的問題。使用了什麼類加載器?

Class.forName("class.name"); 

.... 
NotYetLoadedClass cls = new NotYetLoadedClass(); 
..... 

什麼類加載器將在每種情況下可以使用?對於第一種情況,我假設用於加載類方法代碼正在執行的類加載器。而在第二種情況下,我假設線程上下文類加載器。

如果我錯了,我會讚賞一個小小的解釋。

+5

請參閱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

回答

2

兩者都使用當前的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] 

指示當前ClassLoadersun.misc.Launcher.AppClassLoader)用於加載類。

+0

「當前的'ClassLoader'」是什麼意思? – jameshfisher 2014-08-26 14:29:11

+0

@jameshfisher「當前班級的定義班級加載器」 – Uli 2014-09-02 07:50:37

+0

「當前班級」是什麼意思?詞彙範圍? – jameshfisher 2014-09-02 08:31:37