2015-09-28 53 views
6

據我所知,每個班級都有一個Class的對象。還有一種情況,當我使用同步,例如:當JVM加載類A時,或者當我調用A.class時,是否創建了Class對象A?

public class A { 
    public static void main(String... args){ 
     synchronize(A.class){ 
      //do something... 
     } 
    } 
} 

這將鎖定AClass對象,對不對?什麼時候創建了這個Class對象?它是在JVM加載A類時還是當我撥打A.class時創建的?我無法在JLS中找到詳細信息,有人可以提供關於它的鏈接嗎?

回答

7

這會鎖定A的Class對象,對嗎?

是的。

我的問題是何時創建這個Class對象?是在JVM加載時創建的類還是當我調用A.class時?

當ClassLoader加載它時,它返回一個Class對象。

我無法在JLS中找到詳細信息,有人可以提供關於它的鏈接,謝謝。

我建議讀取的Javadoc爲ClassLoader.loadClass()

+0

嗨,彼得,也是同樣的問題,可以嗎? – Tony

+1

@Tony一個類只有在類加載器是GC'ed時才能被GCed。這意味着類加載器的所有類的所有實例都不再被強引用。主/默認ClassLoader從不GC'ed。 –

+0

謝謝,A a = new A(),我可以說a是A類的一個實例,但A的Class對象是誰的實例,如果它屬於A,我不認爲a = Class對象 – Tony

1

當類是由JVM加載的Javadocs狀態它創建:

Class沒有公開的構造函數。相反,Class對象是由Java虛擬機自動構造的,因爲類是加載的,並且通過調用類加載器中的defineClass方法。

+0

每個類只有一個Class對象的實例,對吧?可以嗎? – Tony

+0

只有一個實例。 [它可以在極端情況下GC'd](http://stackoverflow.com/questions/2433261/when-and-how-are-classes-garbage-collected-in-java)。 – manouti

2

一類由ClassLoader初始化時首次使用該類,JLS 5.3

5.3. Creation and Loading

一類的創建或由名字N表示的接口C由 構成,其中Java虛擬機的方法區域中的構造爲C的實現特定內部表示的0(§2.5.4)。 類或接口創建由另一個類或接口D觸發,該類或接口D通過其運行時常量池引用C類或接口的創建也可能由D在某些Java SE平臺類庫(§2.12)中調用 方法觸發,如 反射

0

是當JVM裝載的類才造就

是。

或者當我打電話給A.class?

不。JVM在加載使用它的類時加載A,除了反射的特殊情況,此處不適用。

相關問題