2015-10-09 61 views
0
static boolean isClassLoaded(String fullname) { 
    try { 
     Class.forName(fullname, false, Loader.instance().getModClassLoader()); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

這個方法是否有可能觸發全名的靜態初始化器? 我有問題與靜態初始化器調用兩次。 當我嘗試檢查類是否使用isClassLoaded加載並嘗試使用該類時,由於構造函數調用兩次而出現錯誤。 任何人都知道什麼是Class.forName(全名,假,Loader.instance()。getModClassLoader())的問題; ?java靜態初始化器被調用兩次

+3

目前還不清楚'Loader.instance()。getModClassLoader()'來自哪裏以及它的作用。此外,你正在討論一個「構造函數被調用兩次」,而不是什麼類的構造函數,以及它與你的問題標題的「靜態intitializer」如何相關。 – Holger

+0

我可以用ThisClass.class.getClassLoader()替換它們。 – MCdevelopers

+0

在這種情況下,不應該調用初始化程序,並且無論構造函數發生什麼異常都與靜態初始化程序無關。 – Holger

回答

1

第二個參數是一個名爲「初始化」的標誌。

docs

,如果它沒有被更早初始化類初始化只有在初始化參數是真實的, 。

所以,如果initialize設置爲false,它不會執行你的靜態初始化。

自給例如

package test; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     Class.forName("test.Main$Foo", false, Main.class.getClassLoader()); 
     System.out.println("blah"); 
     Class.forName("test.Main$Foo", true, Main.class.getClassLoader()); 
    } 

    static class Foo { 
     static { 
      System.out.println("Foo static initializer"); 
     } 
    } 

} 

輸出

blah 
Foo static initializer 

注意它總是打印Foo static initializer只有一次,但在這裏,它打印blah第一,即第一Class.forName調用做不執行靜態初始化程序。