我有這樣的代碼:最終導致靜態不知何故
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它使我能夠更改最終字段值,如果它被初始化不內聯。問題是關於爲什麼不同的初始化導致不同的行爲 –
這就是爲什麼它是一個評論,而不是一個答案,我可以改變最終字段而不做這個伎倆。 –