类加载器、类的全限定名与加载器共同如何决定类型身份;同名类被不同 ClassLoader 加载后为什么不能相互强转?
进阶版来源:jd中级工程师同名类跨加载器强转运行时类型身份类加载器双亲委派与隔离
答案解析
在 JVM 里,一个类的类型身份不是只由类的全限定名决定的,而是由 类的全限定名 + 加载它的 ClassLoader 共同决定的。
也就是说,JVM 判断两个类是不是同一个类型时,会同时看:
类的全限定名,比如 com.example.User 加载这个类的类加载器实例
只有这两个都相同,JVM 才认为它们是同一个类。
举个例子,如果有两个不同的 ClassLoader,都加载了同一个路径下或者同一个包名类名的 com.example.User,从源码和字节码内容上看它们可能完全一样,但在 JVM 看来它们是两个不同的类型。
所以会出现这种情况:
即使它们的类名都是 com.example.User,但因为类加载
登录后查看完整内容
