一个 EAR 包含 2 个 WAR(WAR1、WAR2),这两个 WAR 都有一个依赖 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 都加载到同一个 Ear、jvm、服务器中 - 它们都依赖于同一个 jar。 WAR2 的静态字段如何未更改?
其他一些提示:
- Jar1 由第三方提供,因此无法控制源。
- Jar1 驻留在 WAR1/WEB-INF/lib 和 WAR2/WEB-INF/lib 内
- 服务器是weblogic。
- 我很高兴它成功了:)。但很好奇它的内部是如何工作的,以及是什么拯救了我。
最佳答案
两个 WAR 都有自己的类加载器。为每个 WAR 从 JAR 加载一次类将为您提供 2 个 Class
实例,因此您的 WAR 可以看到成员变量的“它们的版本”,而不是像您期望的那样共享状态。
你也可以想象这种黑客行为会导致什么样的错误,所以我会避免养成这种习惯。
关于java - 使用耳内反射改变静态场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248132/