jvm如何在运行时知道一个对象是哪个类的实例。我知道我们可以使用 getClass 方法来获取类名,但是 getClass 方法是如何工作的呢? 谢谢, 普拉文。
最佳答案
答案?魔法!
不,说真的,它是实现定义的,并且 JVM 的实现不需要使用单一的简单技术,例如将类作为引用存储在实例数据中常量偏移量的字段中。它所需要做的就是确保 getClass
方法可观察到如记录的那样工作。例如,使用 escape analysis ,JVM 可能会在堆上静态分配一个实例,因为它知道该实例的生命周期不会超过堆栈帧。在这种情况下,它可能会选择将 getClass()
调用转换为直接加载 Class
实例,而不是根本调用方法!类似地,由于 getClass()
在逻辑上是一个虚方法(我知道它是最终的,但它的返回值在任何给定类加载器的类的所有实例中都是常量,但对于每个不同的类都不同,就好像它是一个返回常量值的虚拟),它可能会经历与 inline caching 类似的优化.
关于java - JVM如何在运行时知道对象的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723581/