【问题标题】:Overwriting final fields in Java 17覆盖 Java 17 中的最终字段
【发布时间】:2022-11-03 00:09:28
【问题描述】:

我正在尝试通过 Java 17 中的反射覆盖非静态最终字段的值。

据我所知,您不能再从 Java 12 及更高版本开始执行以下技巧:

import java.lang.reflect.*;

class Foo {
private final String bar;

    public Foo(String bar) {
        this.bar = bar;
    }
    
    public String getBar() {
        return this.bar;
    }

}

public class Example {

    public static void main(String[] args) {
        Foo foo = new Foo("foobar");
        System.out.println(foo.getBar());
    
        try {
            Field field = foo.getClass().getDeclaredField("bar");
            field.setAccessible(true);
            Field modifiers = field.getClass().getDeclaredField("modifiers");
            modifiers.setAccessible(true);
            modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        } catch (Exception e) {
            e.printStackTrace();    
        }
    
        System.out.println(foo.getBar());
    }

}

当我在 Java 17 中运行它时,会引发以下异常:

foobar java.lang.NoSuchFieldException: modifiers    at java.base/java.lang.Class.getDeclaredField(Class.java:2610)  at Example.main(Example.java:24) foobar

'bar' 的值保持不变。

是否有覆盖较新版本 Java 的 final 字段的等效方法?在 Google 中进行快速搜索并没有产生与上述解决方案不同的任何东西。我学到的唯一一件事是不可能覆盖静态最终字段,而仍然可以通过反射覆盖非静态最终字段,但我不知道如何。

【问题讨论】:

  • 您无需修改​​ modifiers 字段。只需删除以下三行:Field modifiers = field.getClass().getDeclaredField("modifiers");modifiers.setAccessible(true);modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);

标签: java reflection


【解决方案1】:

这应该有效:

 Field field = foo.getClass().getDeclaredField("bar");
 field.setAccessible(true);
 field.set(foo, "changedBar");

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 2022-01-05
    • 1970-01-01
    • 2013-02-25
    • 2012-02-06
    • 2019-03-31
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多