当前位置: 首页 > 知识库问答 >
问题:

利用耳内反射改变静态场

朱宏爽
2023-03-14

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

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

其他几点:

  • JAR1是由第三方提供的,因此不能控制源。
  • JAR1位于war1/web-inf/lib和war2/web-inf/lib中
  • 服务器是WebLogic。
  • 我很高兴它成功了:)。但我很好奇它在内部是如何运作的,是什么拯救了我的一天。

共有1个答案

微生乐
2023-03-14

这两种战争都有自己的类加载器。为每个WAR从JAR中加载类一次,就会得到class的两个实例,因此WAR可以看到成员变量的“他们的版本”,而不是像您期望的那样看到共享状态。

你也可以想象你会用这种方法造成什么样的错误,所以我会避免养成这样的习惯。

 类似资料:
  • 问题内容: 我有一个带有静态变量的Java类 如何使用反射访问对象? (我有字符串。我需要访问该对象。) 问题答案: 访问静态字段的方式与普通字段完全相同,只是不需要将任何参数传递给方法(可以传递null)。 试试这个:

  • 本文向大家介绍利用反射获取Java类中的静态变量名及变量值的简单实例,包括了利用反射获取Java类中的静态变量名及变量值的简单实例的使用技巧和注意事项,需要的朋友参考一下 JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了。 其中要查看的Java类是: 以上这篇利用反射获取Java类中的静态变量名及变量值的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望

  • 问题内容: 请参考下面的代码。运行代码时,我可以更改最终非静态变量的值。但是,如果我尝试更改最终静态变量的值,则会抛出异常。 我的问题是,为什么在非静态最终变量也不会抛出异常,反之亦然。为什么会有所不同? 问题答案: 该解决方案并非没有缺点,它可能无法在所有情况下都有效: 如果在字段声明中将字段初始化为编译时常量,则对该字段的更改可能不可见,因为该最终字段的使用会在编译时用编译时常量替换。 另一个

  • 问题内容: 我有一堂课,但不幸的是,我需要在运行时更改它。 使用反射我得到这个错误: 有什么办法可以改变价值? 问题答案: 假设没有阻止你执行此操作,则可以使用来绕开并重置修饰符以摆脱,并实际上修改字段。 这是一个例子: 假设没有SecurityException抛出,上面的代码将打印出来”Everything is true”。 实际执行的操作如下: 基本boolean值true和falsein

  • 问题内容: 我想调用静态的方法。我得到了类型的对象,但是我无法创建该类的实例,也无法调用该方法。 问题答案: 如果方法是私有使用而不是。并调用方法对象。

  • 使用Java反射更改私有静态final字段 我按照上面链接中的说明使用java反射更改私有静态final字段。我有一个名为“数据”的对象在“data”内部,有一个名为“type”的私有静态最终变量我想将“type”设置为null。这是我的密码。 我试着在Java1.7上用类似的代码来做这件事,结果成功了。但是在Android上运行此代码会产生以下错误:java。lang.NoSuchFieldEx