JVM如何存储类的元信息?

my *_*YAN 2 java reflection jvm class

我们将用户定义的类Employee的反射用作:

Employee e = new Employee();
Class c = e.getClass();
Run Code Online (Sandbox Code Playgroud)

根据我的知识,第一个JVM加载类Employee的字节码,然后它还为每个加载的类(此处为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的字节码存储在哪里?

Pet*_*rey 5

在Class.class的哪个字段中存储有关类的各种信息?

这些信息存储在PermGen(<Java 7)或MetaSpace(Java 8+)中的堆中.您无法直接从Java中看到它.

Employee的JVM对象的内存区域和Class.class的对象存储在哪里?

所有对象都存储在堆上.在伊甸园空间中创建较小的对象.

Employee的JVM字节码的存储区和Class.class的字节码存储在哪里?

字节代码存储在PermGen/Metaspace中,如果它完全存储的话.理论上,虽然不是在实践中,但JVM可以根据需要重新读取类文件.