當前位置:才華齋>計算機>java語言>

Java面試題如何通過反射獲取和設定物件私有欄位的值

java語言 閱讀(7.93K)

引導語:private關鍵字定義的都是私有欄位,以下是本站小編分享給大家的Java面試題如何通過反射獲取和設定物件私有欄位的值?歡迎閱讀學習!

Java面試題如何通過反射獲取和設定物件私有欄位的值

 如何通過反射獲取和設定物件私有欄位的值?

答:可以通過類物件的getDeclaredField()方法欄位(Field)物件,然後再通過欄位物件的setAccessible(true)將其設定為可以訪問,接下來就可以通過get/set方法來獲取/設定欄位的.值了。下面的程式碼實現了一個反射的工具類,其中的兩個靜態方法分別用於獲取和設定私有欄位的值,欄位可以是基本型別也可以是物件型別且支援多級物件操作,例如(dog, “”);可以獲得dog物件的主人的汽車的引擎的ID號。

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import 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);}}}