我们将用户定义的类Employee的反射用作:
Employee e = new Employee();
Class c = e.getClass();
据我所知,首先JVM加载Employee类的字节码,然后它还为每个加载的类(此处为Employee类)创建一个Class.class对象。在Class.class的对象中,JVM存储有关最近加载的类的元信息。
类的元信息是"方法名称","字段名称"这些类型的类别,例如"方法","字段"等在java.lang.reflect包中定义。
我看过Class.java的代码。我在Class.class中找到了返回这些类型的对象或对象数组的方法,例如"方法","字段"但是Class.class中没有一个字段,其类型为"方法","字段"等
如果我的上述陈述错误,请认真对待。如果以上陈述没有错,那么我有以下疑问: 1)。在Class.class的哪个字段中存储有关类的各种信息? 2)。 Employee的JVM对象的内存区域和Class.class的对象存储在哪里? 3)。 Employee的JVM字节码的存储区和Class.class的字节码存储在哪里?
答案 0 :(得分:5)
在Class.class的哪个字段中有关类的各种信息被存储?
此信息存储在PermGen(< Java 7)或MetaSpace(Java 8+)中的堆中。您无法直接从Java中看到它。
Employee的JVM对象的内存区域和Class.class的对象存储在哪里?
所有对象都存储在堆上。在伊甸园空间中创建了较小的对象。
在Employee的JVM字节码和Class.class的字节码的哪个存储区中存储?
字节代码存储在PermGen / Metaspace中,如果它完全存储的话。理论上,虽然不是在实践中,但JVM可以根据需要重新读取类文件。