2016-04-25 12 views
2

我們使用反射爲用戶定義的類員工爲:JVM如何存儲一個類的元信息?

Employee e = new Employee(); 
Class c = e.getClass(); 

按我的知識首先JVM裝載Employee類的字節碼,那麼它也創造Class.class的對象爲每個加載的類(類員工在這裏)。在Class.class的對象中,JVM存儲關於最近加載的類的元信息。

類的元信息是「方法名稱」,「字段名稱」等。這些類型的類,如「Method」,「Field」等在java.lang.reflect包中定義。

我看到了Class.java的代碼。我在Class.class中找到了返回對象或這些類型的對象數組的方法,例如「Method」,「Field」等。但Class.class中沒有類型爲「Method」,「Field」等的字段

如果我上面的說法不對,請讓我正確。如果上面的陳述沒有錯,那麼我有以下懷疑: 1)。在Class.class的哪個字段中存儲有關類的各種信息? 2)。 Employee的JVM對象的內存區域和Class.class的對象存儲在哪個區域? 3)。 Employee的JVM字節碼的存儲區和Class.class的字節碼存儲在哪個區域?

+0

爲什麼對你很重要? – Holger

回答

5

在Class.class的哪個字段中存儲有關類的各種信息?

此信息在PermGen(< Java 7)或MetaSpace(Java 8+)中存儲堆不能直接從Java中看到。

Employee中的JVM對象的內存區域和Class.class的對象得到存儲?

所有對象都存儲在堆上。較小的物體在伊甸園空間中創建。

Employee的JVM字節碼的存儲區和Class.class的字節碼存儲在哪個存儲區?

字節碼存儲在PermGen/Metaspace中,如果它存儲的話。理論上,儘管不是實踐,但JVM可以根據需要重新讀取類文件。

+1

對於標準類加載體系結構,由於運行時類是通過['ClassLoader.defineClass'](https://docs.oracle.com/javase/8/docs/)創建的,因此JVM無法重新讀取類文件api/java/lang/ClassLoader.html#defineClass-java.lang.String-byte:A-int-int-)et al。接收一個字節數組或ByteBuffer,但沒有關於這些字節的來源的信息... Java 9可能會改變這一點。 – Holger

+0

@霍爾我已經對此聲明進行了限定。好點子。 +1 –