一个EAR包含2个WAR(WAR1,WAR2)。这两个WARS都有一个依赖项jar(JAR1)。

JAR1有一个类(CLASS1),其中是一个静态字段private String STATIC1 = "DEFAULT_VAL";,它适用于WAR2,但不适用于WAR1。所以我在WAR1中添加了一项服务来对其进行修改:

@Service
public class ModService {
    @PostConstruct
    public void modMyVal() {
        Field declaredField = CLASS1.class.getDeclaredField("STATIC1");
        declaredField.setAccessible(true);
        declaredField.set(this, "NEW_VAL_FOR_WAR1");
    }
}


令我惊讶的是,WAR2中的一切运行正常。我期望WAR2具有NEW_VAL_FOR_WAR1。两个WAR都加载在同一个耳朵,jvm,服务器中-它们都依赖于同一jar。 WAR2的静态字段如何更改?

其他几个指针:


Jar1由第三方提供,因此无法控制源。
Jar1驻留在WAR1 / WEB-INF / lib和WAR2 / WEB-INF / lib内部
服务器是weblogic。
我很高兴它起作用:)。但是很好奇它在内部如何工作,什么在拯救我的一天。

最佳答案

两个WAR都有自己的类加载器。为每个WAR从JAR加载一次该类将为您提供Class的2个实例,因此您的WAR可以看到成员变量的“其版本”,而不是您期望的共享状态。

您还可以想象一下,使用这种黑客可能会导致哪种错误,所以我会避免养成这种习惯。

10-08 14:33