java - JVM如何存储类的元信息?

标签 java class reflection jvm

我们对用户定义的 Employee 类使用反射,如下所示:

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

据我所知,JVM 首先加载 Employee 类的字节码,然后它还为每个加载的类(此处为 Employee 类)创建一个 Class.class 对象。在 Class.class 对象中,JVM 存储有关最近加载的类的元信息。

类的元信息是“方法名称”、“字段名称”等。“方法”、“字段”等类型的类在 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的字节码存储在哪个内存区域?

最佳答案

In which field of Class.class various information about a class get stored?

此信息存储在 PermGen (< Java 7) 或 MetaSpace (Java 8+) 中的堆外,您无法直接从 Java 中看到它。

In which memory area of JVM object of Employee and object of Class.class get stored?

所有对象都存储在堆上。较小的对象是在 Eden 空间中创建的。

In which memory area of JVM bytecode of Employee and bytecode of Class.class get stored?

字节码存储在 PermGen/Metaspace 中(如果有的话)。理论上,尽管实际上并非如此,JVM 可以根据需要重新读取类文件。

关于java - JVM如何存储类的元信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36833232/

相关文章:

java - 正则表达式仅捕获特定标签内的数字

java - 硬编码身份验证更容易调试

PHP[OOP] - 如何手动调用类构造函数?

swift - Swift 类初始值设定项中的可选类初始值设定项参数

generics - 在 Go 中实现通用映射器的惯用方法

reflection - 我可以在 Go 中使用反射创建一个新函数吗?

javascript - Angular JS 和 Spring - 如何过滤 JSON 对象

java - 在 Kafka 中使用实时消息

Java : Two similar classes, 一个不可变的 - 在它们之间共享代码

java - 反射/类 -> 命名类