1. 程式人生 > 其它 >修改欄位型別_Java反射機制-修改欄位值

修改欄位型別_Java反射機制-修改欄位值

技術標籤:修改欄位型別

需要用到的類: 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));

結果如下:

f956eb9f50d379642749719628c9a37b.png

以下是修改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));

結果如下:

40dff619af810b928e453a712fbdc8e6.png

以下是修改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();
}

結果如下:

d2bed1939535d2ff023d9b869936ed97.png

在修改e時,用上邊的程式碼進行修改時,發現並不能更改欄位的值,這是因為它在修改靜態常量的時候有侷限性,並不能修改基本資料型別,僅能修改封裝類。

結果如下:

0fa04ae891de0b42272e4ae0b8cb0265.png

在獲取公有欄位時,我們只需要使用getField()方法就可以了。

在獲取私有欄位時,我們需要使用getDeclaredField()方法才可以。

並且在更改私有欄位時,我們需要呼叫setAccessible()方法。

true是代表不檢查,false是代表檢查。檢查的是訪問許可權。