gpt4 book ai didi

java - 使用耳内反射改变静态场

转载 作者:行者123 更新时间:2023-12-02 02:09:24 26 4
gpt4 key购买 nike

一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com