1. 程式人生 > 其它 >8.23Java反射訪問成員變數

8.23Java反射訪問成員變數

8.23Java反射訪問成員變數

訪問成員變數的方法

  • 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!!!