2011-03-07 41 views
3

在Java中,首次使用類時,所有類都會動態加載到JVM中。爲什麼這個類文件被創建?

這是否意味着如果我在源文件中有類並且我沒有提及它,那麼它的Class對象沒有被創建(即.class文件沒有被創建)?

在下面的示例代碼中,iam沒有引用test3類,但仍創建了它的類對象。

class test1 { 
    static { 
     System.out.println("static block of test1"); 
    } 
} 
class test2{ 
    static { 
     System.out.println("static block of test2"); 
    } 
} 
class test3 {} 
class MyExample1 { 
    public static void main(String ...strings) { 
    new test1(); 
    new test2(); 
    } 
} 

爲什麼test3.class文件被創建?

+1

「加載類」是**不是**與「創建.class文件」。在編譯步驟之後,動態類加載發生* *,這會創建.class文件。 – 2011-03-07 07:17:13

回答

6

.class文件創建於彙編時間。但是,它將通過首次使用(可能)從.class文件加載。

從那裏應該沒有的.class文件被加載?)

1

你有文件區分test3.class(這是由編譯器生成)和類對象test3.classtest3類,它是在類由類加載器加載時在運行時創建的。如果你在它與類編譯.java源文件(編譯單元)

類文件始終創建(通常class3.java,但它也可以被命名爲別的,如果類是不公開的) - 或者如果該類被另一個編譯類使用,則會隱式地執行。

類對象是在類首次加載時由類加載器創建的 - 只要需要或以前就會發生。正常的URLClassLoader從具有相同名稱的文件加載您的類,但原則上也可以即時生成數據,從數據庫或類似文件加載數據。 然後通過調用static塊來初始化它(類)。 (初始化是第二步,不一定在同一時間,但兩者都是在您第一次使用該類之前。)

相關問題