JVM如何在运行时知道对象的类

Pra*_*een 4 java jvm

jvm如何知道对象是运行时的实例.我知道我们可以使用getClass方法来获取类名,但getClass方法如何工作?Thx,Praveen.

Bar*_*lly 5

答案?魔法!

不,严重的是,它是实现定义的,并且JVM的实现不需要使用单个简单技术,例如将类作为引用存储在实例数据中的常量偏移量的字段中.它所需要做的就是确保getClass方法可以按照文档记录的方式工作.例如,通过转义分析,JVM可以静态地在堆上分配实例,因为它知道实例不会超过堆栈帧.在这种情况下,它可能会选择将一个getClass()调用转换为Class实例的直接加载,而不是一个方法调用!类似地,因为getClass()逻辑上是一个虚方法(我知道它是最终的,但它的返回值在任何给定类加载器的类的所有实例中都是常量,但对于每个不同的类是不同的,就好像它是一个返回常量值的虚拟),它可能会对内联缓存进行类似的优化.


dth*_*rpe 2

我不知道JVM的具体情况,但是在大多数面向对象语言+运行时系统(Delphi,C++,.NET)中,都会在对象实例数据中添加一个隐藏字段,该字段指向对象实例的类型信息。

将对象实例直接映射到外部数据结构时必须小心这一点,因为对象实例数据中的隐藏类型信息或虚拟方法表指针将与外部数据结构中的字段失去对齐。

您通常可以通过查看对象实例的大小来看到此工件。Sizeof() 或等效函数。没有声明字段的对象的内存占用仍然大于零。这就是类型信息魔法的来源。