最近在测试项目代码中遇到同一个类由不同的classloader加载后出现的问题:
- 类A中有一个字段a,它的类型为X
- 类B中有一个字段b,它的类型也为X
- 类A由classLoaderA所加载,类B由classLoaderB所加载
- 执行赋值语句A.a = B.b,由于这两个类型均为X,可以执行,但是有一个要求,这个要求就是在A中所装载类X的装载器必须和在B中装载类X的装载器相同,否则赋值语句失败
为什么会产生上面的输出,我们可以来看一个以下的代码
首先是一个简单的类调用:
类Foo3
1 public class Foo3 implements IFoo{ 2 public void hello() throws Exception{ 3 Class<?> clazz = Foo.class; 4 Foo foo2 = Foo4.foo; 5 } 6 }
在上面的代码中,变量foo2引用了类Foo4的一个静态引用:
1 public class