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

标签 java spring reflection

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

相关文章:

java - 将短数组转换为字节数组和将字节数组转换为短数组

java - PDFBox 和 BouncycaSTLe 签名无效

c# - 获取枚举值的属性

scala - 为什么 Scala 方法 isInstanceOf[T] 不起作用

java - android getSystemService(String s) - 反射?

java - java中socket api的问题

java - 使用 AssertJ 在测试中获取 JSlider 值

java - Spring 。如何将beans.xml与jar放在同一文件夹中?

java - 如何在运行时创建Mono序列

java - 使用 hibernate 以编程方式验证架构