2011-07-01 61 views
3

我想創建自定義類加載器。但是我對loadClass()感到困惑,這個方法是否將指定的類加載到內存中?loadClass()的classLoader將類加載到內存中嗎?

如果是,那麼爲什麼不調用指定類的靜態塊?

//main class 

package custom_class_loader1; 


public class Custom_class_loader1 { 


    public static void main(String[] args) { 

     try{ 
     CustomClassLoader c=new CustomClassLoader(); 
     Class c1= c.loadClass("custom_class_loader1.ABC");/**does this load ABC class into memory?**/ 

     }catch(Exception e) 
     { 
      System.out.println(e); 

    } 
} 
} 

回答

7

當你加載一個類時,它不會初始化它,直到它被默認使用。

調用此方法相當於調用loadClass(name,false);

這裏false表示不解析該類。控制這個

一種方法是使用的Class.forName()

public class Main { 
    public static void main(String[] args) throws ClassNotFoundException { 
     ClassLoader cl = new URLClassLoader(new URL[0], ClassLoader.getSystemClassLoader()); 
     System.out.println("unresolved Test"); 
     cl.loadClass("Test"); 
     // or 
     Class.forName("Test", false, cl); 

     System.out.println("\ninitialise Test"); 
     Class.forName("Test", true, cl); 
    } 
} 

class Test { 
    static { 
     System.out.println("Loaded Test class"); 
    } 
} 

打印

unresolved Test 

initialise Test 
Loaded Test class 
+1

+1時調用靜態塊。我們有三個步驟:加載,鏈接和初始化。 'loadClass'在步驟2之後完成。 –

1

其他地方會加載它嗎? loadClass返回表示剛加載的類的Class<?>類型的對象。

+0

那麼爲什麼不調用ABC類的靜態塊?????? –

+0

初始化 –