小编Vla*_*rko的帖子

最后以某种方式导致静态行为

我有这样的代码:

public class App {
    private final String some;
    public App(){
        some = "old";
    }
    public static void main(String... args) throws NoSuchFieldException, IllegalAccessException {
        App a = new App();
        a.magic();
        System.out.println(a.some);

    }
    private void magic() throws NoSuchFieldException, IllegalAccessException {
        Field field = this.getClass().getDeclaredField("some");
        field.setAccessible(true);
        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(this, "new");
        String someDuplicate = (String) field.get(this);
        System.out.println(someDuplicate);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个输出将是

new 
new
Run Code Online (Sandbox Code Playgroud)

但如果我将变量初始化更改为:

private final String some = "old";
Run Code Online (Sandbox Code Playgroud)

输出将是

new
old
Run Code Online (Sandbox Code Playgroud)

看起来像内联初始化会导致最终非静态字段的静态行为

我找不到这种行为的任何码头参考,可能有一些合理的解释.

顺便说一句,init方式的这种方式会导致类似于构造函数初始化的行为:

{ …
Run Code Online (Sandbox Code Playgroud)

java reflection static final

1
推荐指数
1
解决办法
44
查看次数

标签 统计

final ×1

java ×1

reflection ×1

static ×1