引導語:private關鍵字定義的都是私有欄位,以下是本站小編分享給大家的Java面試題如何通過反射獲取和設定物件私有欄位的值?歡迎閱讀學習!
如何通過反射獲取和設定物件私有欄位的值?
答:可以通過類物件的getDeclaredField()方法欄位(Field)物件,然後再通過欄位物件的setAccessible(true)將其設定為可以訪問,接下來就可以通過get/set方法來獲取/設定欄位的.值了。下面的程式碼實現了一個反射的工具類,其中的兩個靜態方法分別用於獲取和設定私有欄位的值,欄位可以是基本型別也可以是物件型別且支援多級物件操作,例如(dog, “”);可以獲得dog物件的主人的汽車的引擎的ID號。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | import tructor; import d; import fier; import yList; import ; /**
* 反射工具類
* @author 駱昊
*
*/ public class ReflectionUtil {
private ReflectionUtil() {
throw new AssertionError();
}
/**
* 通過反射取物件指定欄位(屬性)的值
* @param target 目標物件
* @param fieldName 欄位的名字
* @throws 如果取不到物件指定欄位的值則丟擲異常
* @return 欄位的值
*/
public static Object getValue(Object target, String fieldName) {
Class<?> clazz = lass();
String[] fs = t( "." );
try {
for ( int i = 0 ; i < th - 1 ; i++) {
Field f = eclaredField(fs[i]);
ccessible( true );
target = (target);
clazz = lass();
}
Field f = eclaredField(fs[th - 1 ]);
ccessible( true );
return (target);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 通過反射給物件的指定欄位賦值
* @param target 目標物件
* @param fieldName 欄位的名稱
* @param value 值
*/
public static void setValue(Object target, String fieldName, Object value) {
Class<?> clazz = lass();
String[] fs = t( "." );
try {
for ( int i = 0 ; i < th - 1 ; i++) {
Field f = eclaredField(fs[i]);
ccessible( true );
Object val = (target);
if (val == null ) {
Constructor<?> c = ype()eclaredConstructor();
ccessible( true );
val = nstance();
(target, val);
}
target = val;
clazz = lass();
}
Field f = eclaredField(fs[th - 1 ]);
ccessible( true );
(target, value);
}
catch (Exception e) {
throw new RuntimeException(e);
}
} } |