2012-06-14 87 views
1

加載類時,使用方法forName(),將執行該類中的任何靜態initializers。 我可以預防嗎?java動態類加載

try { 
     Class.forName("MYClass"); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

MyClass的

class MyClass{ 

static String TEST="MYCLASS"; 
static SomeClass sm=new SomeClass(); 
} 

doc發現存在的Class.forName(的重載版本)即

public static Class<?> forName(String name, 
          boolean initialize, 
          ClassLoader loader) 
        throws ClassNotFoundException 

什麼是initialize參數?

+2

否<!------------------ > –

+0

只需刪除'static'關鍵字! – adarshr

+0

沒有。你能解釋爲什麼你甚至需要這個。 –

回答

0

如果你不想執行靜態初始化試類文字而不是調用Class.forName

class A1{ 
    static{ 
     System.out.println("static block from A1"); 
    } 
} 

class B1{ 
    public static void main(String[] args) throws ClassNotFoundException { 
//  Class.forName("A1");//this will invoke static initialization 
     Class c=A1.class;//this will not invoke static initialization 
    } 
} 
0

這是Java如何創建對象,所以沒有。一種方法是在其他時間延遲加載實例。這意味着你將不得不刪除靜態引用。

例如

public SomeClass getSomeClass() { 
    if (sm == null) { 
     return new SomeClass(); 
    } 

    return sm; 

}