修改欄位型別_Java反射機制-修改欄位值
阿新 • • 發佈:2020-12-25
技術標籤:修改欄位型別
需要用到的類: Field
需要用到的方法:
getDeclaredField();
getField();
setAccessible();
需要用到的欄位:
public int a=5;
public final int b=5;
private final int c=5;
private static final Integer d=5;
private static final int e=5;
修改欄位的值時,需要根據欄位的訪問限制來更改訪問許可權。
以下是修改a和b的程式碼:
ClassB classB=new ClassB(); Field field = ClassB.class.getField("a"); System.out.println(field.get(classB)); field.setInt(classB,10); System.out.println(field.get(classB));
結果如下:
以下是修改c的程式碼:
ClassB classB=new ClassB();
Field field = ClassB.class.getDeclaredField("c");
field.setAccessible(true);
System.out.println(field.get(classB));
field.setInt(classB,10);
System.out.println(field.get(classB));
結果如下:
以下是修改d的程式碼:
public static void main(String[] args)throws Exception { ClassB classB=new ClassB(); Field field = ClassB.class.getDeclaredField("d"); field.setAccessible(true);//設定許可權 classB.print(); //靜態常量不能修改,如果要修改的話需要通過以下步驟去除final的影響。 Field field2 = Field.class.getDeclaredField("modifiers"); field2.setAccessible(true); field2.setInt(field, 10); field.set(null, 10); classB.print(); }
結果如下:
在修改e時,用上邊的程式碼進行修改時,發現並不能更改欄位的值,這是因為它在修改靜態常量的時候有侷限性,並不能修改基本資料型別,僅能修改封裝類。
結果如下:
在獲取公有欄位時,我們只需要使用getField()方法就可以了。
在獲取私有欄位時,我們需要使用getDeclaredField()方法才可以。
並且在更改私有欄位時,我們需要呼叫setAccessible()方法。
true是代表不檢查,false是代表檢查。檢查的是訪問許可權。