我们确实有一个缓存(Map
) 与 Class 的对象TestClass
。另一个类加载器初始化/加载TestClass
再次在运行时,所以下面的代码会抛出一个ClassCastException
:
TestClass obj1 = (TestClass)map.get("key"); // throws a ClassCastException
转换为同一个类时出现 ClassCastException
好吧,到目前为止我确实理解这个问题。
所以,我试图寻找背景信息为什么TestClass.class
不等于TestClass.class
。我假设不同的类加载器为 ReferenceType 设置了不同的 id?有谁能给我解释一下背景吗?
我找到的最佳页面:http://www.objectsource.com/j2eechapters/Ch21-ClassLoaders_and_J2EE.htm
是的,您的研究指出了正确的方向:由不同类加载器加载的相同类定义被 JVM 视为两个不同的类。因此它们之间的转换失败ClassCastException
.
我认为差异只是因为有两个不同的类令牌对象在起作用。它必须是这样的,因为不同加载器加载的类实际上可能是同一类的不同版本。众所周知,每个类的类标记都是唯一的(即在同一个类加载器领域内)。如果 JVM 开始通过类标记的各种属性而不是物理相等性来比较类标记,那么将会引发一系列蠕虫病毒(==
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)