我有这样的代码:最终导致静态不知何故
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);
}
}
从这个输出将是
new
new
,但如果我会改的变量初始化到这一点:
private final String some = "old";
输出将为
new
old
好像直列初始化导致最终的非静态字段
我could'n发现任何船坞参照这种行为的静态样的行为,可能会出现这种一些合乎逻辑的解释。
顺便说这种方式来初始化场引起的行为就像在构造函数初始化情况:
{
some = "old";
}
顺便说一句,通过反射使字段非最终没有做任何事情。 –
@PeterLawrey它使我能够更改最终字段值,如果它被初始化不内联。问题是关于为什么不同的初始化导致不同的行为 –
这就是为什么它是一个评论,而不是一个答案,我可以改变最终字段而不做这个伎俩。 –