是否允许在使用多个ClassLoaders

时间:2015-08-14 22:23:10

标签: java classloader equality

我只是偶然发现this question使用==.equals()比较枚举值。共同的同意是,使用==是绝对可以的,因为一次只能存在一个枚举常量。这也是我的第一个想法。

但是:如何使用两个(或更多)ClassLoader加载同一个类。不一定是枚举类。任何包含静态常量的类。

想象一下:

class ContainsConstants {
    public static final Object DEMO_CONSTANT = new Object();
}

让我们从另一个类中引用这个值:

class Pojo {
    public final Object myField = ContainsConstants.DEMO_CONSTANT;
}

现在使用clazz.newInstance()创建两个Pojo实例,其中clazz由不同的ClassLoader加载,并将myField相互比较并与ContainsConstants.DEMO_CONSTANT进行比较:

Thread.currentThread().setContextClassLoader(classLoader1);
Pojo pojo1 = instantiatePojoReflectivelyFromClassLoadedBy(classLoader2);
Pojo pojo2 = instantiatePojoReflectivelyFromClassLoadedBy(classLoader3);
if (pojo1.myField == pojo2.myField) {
    // what happens?
}
if (ContainsConstants.DEMO_CONSTANT == pojo1.myField) {
    // what happens?
}

问题:这两个领域是否相同?如果没有,equals方法是否会解决这个问题,因为它可能会在内部使用静态内容(比如字符串)?

0 个答案:

没有答案