通过多个类加载器获得的类实例

maw*_*wia 6 java classloader

我正在读这篇文章,它说:

如果我们有两个由这些CustomClassLoader加载的Student类实例,例如student1和student2,那么student1和student2不是类型兼容的.换一种说法,

学生3 =(学生)学生2;

将抛出ClassCastException,因为JVM将这两者视为独立的,不同的类类型,因为它们由不同的ClassLoader实例定义.

现在我明白了它想传达的内容:那就是如果我们通过使用两个不同的类加载器加载相同的类然后它们将不是类型兼容的.所以很好.

但它使用的例子让我感到困惑,即

学生3 =(学生)学生2;

当我们声明像Student student这样的引用变量时,编译器所寻找的是这个Studnet是否符合其包结构的正确位置.现在我们在运行时将这个引用变量分配给一个真实的加载类,我们用来加载上述类的类加载器真的很重要吗?我怀疑,因为根据我的理解,类加载器只有在我们执行'new'或者我们在其上调用静态字段时才会起作用而不是当我们简单地声明它的一种类型.

请在此澄清我,并帮助我纠正我对这方面的理解.

谢谢,Mawia

Aar*_*lla 4

这基本上是正确的,但是当分配发生时,JVM 需要确保它是正确的。因此它会检查:我可以将右侧(RHS)分配给左侧(LHS)吗?

规则规定,当您可以将 RHS 的运行时类型向下转换为 LHS 的类型时,这是允许的。

所以在编译时,上面的代码看起来没问题。但在运行时,调用isAssignableFrom()返回 false,因为这两种类型不同。

如果限定名称相等类加载器相同,则返回equals()该方法。这就是为什么你在这种情况下会得到 a 。ClasstrueClassCastException

使用的方法是作为本机代码实现的,因此您无法看到发生了什么。但只有当两个类的类加载器相同时,方法isInstance()和才会返回 true。isAssignableFrom()