[面试题] 如何判断 JVM 中两个类是不是同一个类?
📖 版块 A:知识讲解版 (温故知新)
-
JVM 判断两个类是否相同的标准:
- 全限定类名相同
- 并且由同一个类加载器加载
-
为什么类加载器也算身份的一部分:
- JVM 里类的真正身份,不只是字节码文件名。
- 同名类如果由不同类加载器加载,在 JVM 看来就是两个完全不同的类型。
-
典型现象:
- 同样的类名和字节码,在不同类加载器下可能互相
instanceof失败。 - 这在 Tomcat、插件系统、自定义类加载器场景里很常见。
- 同样的类名和字节码,在不同类加载器下可能互相
🎤 版块 B:面试实战版 (高手逐字稿)
Q:如何判断 JVM 中两个类是不是同一个类?
💬 高手逐字稿:
在 JVM 里,判断两个类是不是同一个类,标准不是只看类名,而是看两件事:
- 全限定类名是不是一样
- 定义它们的类加载器是不是同一个
也就是说,JVM 里的类身份,本质上是“类名 + 类加载器”共同决定的。
这也是为什么在一些容器化、插件化场景里,经常会出现一个很诡异的现象:两个类源码明明一模一样,类名也完全一样,但在运行时 instanceof 居然失败,或者强转直接抛 ClassCastException。
根本原因就是:它们是被不同的类加载器加载进来的,所以 JVM 认为它们是两个不同类型。
所以这道题虽然短,但特别能体现你对类加载本质的理解。只要记住一句话就够了:
JVM 不只认类名,还认把这个类带进 JVM 的那个类加载器。
最后更新于: