8.23Java反射訪問成員變數
阿新 • • 發佈:2021-08-23
訪問成員變數的方法
-
getFields()
-
getField(String name)
-
getDeclaredFields()
-
getDeclaredField(String name)
會返回一個Field物件,代表一個成員變數
object.getDeciaredField("price");
Filed
類常用的方法
方法名稱 | 說明 |
---|---|
getName() | 獲得該成員變數的名稱 |
getType() | 獲取表示該成員變數的 Class 物件 |
get(Object obj) | 獲得指定物件 obj 中成員變數的值,返回值為 Object 型別 |
set(Object obj, Object value) | 將指定物件 obj 中成員變數的值設定為 value |
getlnt(0bject obj) | 獲得指定物件 obj 中成員型別為 int 的成員變數的值 |
setlnt(0bject obj, int i) | 將指定物件 obj 中成員變數的值設定為 i |
setFloat(Object obj, float f) | 將指定物件 obj 中成員變數的值設定為 f |
getBoolean(Object obj) | 獲得指定物件 obj 中成員型別為 boolean 的成員變數的值 |
setBoolean(Object obj, boolean b) |
將指定物件 obj 中成員變數的值設定為 b |
getFloat(Object obj) | 獲得指定物件 obj 中成員型別為 float 的成員變數的值 |
setAccessible(boolean flag) | 此方法可以設定是否忽略許可權直接訪問 private 等私有許可權的成員變數 |
getModifiers() | 獲得可以解析出該方法所採用修飾符的整數 |
示例:
package PracticeReview.Reflect;
/**
* 反射訓練類,用於練習
* @since JDK 1.8
* @date 2021/08/23
* @author Lucifer
*/
public class ReflectPracticeDemoNo3 {
String name;
public int id;
private float price;
protected boolean isLoan;
}
訪問成員變數測試類:
package PracticeReview.Reflect;
import java.lang.reflect.Field;
public class ReflectTestNo3 {
public static void main(String[] args) {
ReflectPracticeDemoNo3 reflectPracticeDemoNo3 = new ReflectPracticeDemoNo3();
//獲取動態類
Class class1 = reflectPracticeDemoNo3.getClass();
// 獲取ReflectPracticeDemoNo3類的所有成員
Field[] declaredFields = class1.getDeclaredFields();
// 遍歷所有的成員
for(int i = 0;i < declaredFields.length;i++) {
// 獲取類中的成員變數
Field field = declaredFields[i];
System.out.println("成員名稱為:" + field.getName());
Class fieldType = field.getType();
System.out.println("成員型別為:" + fieldType);
boolean isTurn = true;
while (isTurn) {
try {
// 如果該成員變數的訪問許可權為private,則丟擲異常
isTurn = false;
System.out.println("修改前成員的值為:" + field.get(reflectPracticeDemoNo3));
// 判斷成員型別是否為int
if (fieldType.equals(int.class)) {
System.out.println("利用setInt()方法修改成員的值");
field.setInt(reflectPracticeDemoNo3, 100);
} else if (fieldType.equals(float.class)) {
// 判斷成員變數型別是否為float
System.out.println("利用setFloat()方法修改成員的值");
field.setFloat(reflectPracticeDemoNo3, 29.815f);
} else if (fieldType.equals(boolean.class)) {
// 判斷成員變數是否為boolean
System.out.println("利用setBoolean()方法修改成員的值");
field.setBoolean(reflectPracticeDemoNo3, true);
} else {
System.out.println("利用set()方法修改成員的值");
field.set(reflectPracticeDemoNo3, "Java程式設計");
}
System.out.println("修改後成員的值為:" + field.get(reflectPracticeDemoNo3));
} catch (Exception e) {
System.out.println("在設定成員變數值時丟擲異常,下面執行setAccessible()方法");
field.setAccessible(true);
isTurn = true;
}
}
}
}
}
It's a lonely road!!!