如果類這樣定義:
public class Test {
public final String field =“abc”;
public String getField()
{
return field;
}
}
反編譯之后會發現入下代碼:
/*** Eclipse Class Decompiler plugin, copyright (c) 2012 Chao Chen (cnfree2000@hotmail.com) ***/
public class Test {
public final String field = "abc";
public String getField() {
return "abc";
}
}
可以看出field變量被直接賦值為了“abc”,所以如果你通過java反射機制修改了field變量的值,用getField方法獲取到的field仍然為"abc"
如果類如下定義:
public class Test {
public final String field;
public Test() {
super();
this.field = "abc";
}
public String getField()
{
return field;
}
}
也即在構造函數中對field賦值,則通過反射機制獲取到的field為修改后的值。
反射機制修改代碼:
public static Field getFields(Class cuClass,String fieldName) throws NoSuchFieldException {
Field[] fields=cuClass.getDeclaredFields();
for(Field field:fields){
if(field.getName().equals(fieldName)){
field.setAccessible(true);
return field;
}
}
throw new NoSuchFieldException("No such Field:"+fieldName);
}
public static void main(String[] args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
Test t = new Test();
Field f = getFields(t.getClass(),"field");
f.set(t, "asdf");
System.out.println(f.get(t));
System.out.println(t.field);
}