一个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可以看到成员变量的“其版本”,而不是您期望的共享状态。
您还可以想象一下,使用这种黑客可能会导致哪种错误,所以我会避免养成这种习惯。