反射取子類、父類 屬性
阿新 • • 發佈:2019-02-09
class Person { int age = 6; //這裡的變數需要設定成public或default,下面說明原因 public int getInfo() throws Exception { return this.age; } public int getInfo2() throws Exception { int result = 0; Class clazz = this.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { result = Integer.valueOf(field.get(this).toString()); } return result; } } class Student extends Person { int age = 5; } public class Test2 { public static void main(String args[]) throws Exception { Student s = new Student(); System.out.print(s.getInfo()); System.out.print(s.getInfo2()); } }
輸出結果:
getInfo返回Person類的age;
getInfo2返回Student類的age
Class clazz=this.getClass();這行程式碼得到的類其實是Student,
如果把這行程式碼改為:Class clazz=Person.class;結果就都返回Person類的age
說明:
1)Class.getFields() 方法可以得到本類及其超類的所有可訪問公共欄位(public);
2)Class.getDeclaredFields()這個方法取得本類所有欄位
如果要獲得父類可以用
Class.getSuperclass()取得其超類,並用Class.getDeclaredFields()取得超類的所有欄位;
這裡補充前面的變數設定的原因,因為在java程式碼中常常將一個類的成員變數置為private,在類的外面獲取此類的私有成員變數的value時,需要注意在獲取Field之前呼叫setAccessible(true)方法,如:
public class Main { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.test.accessible.AccessibleTest"); AccessibleTest at = new AccessibleTest(); at.setId(1); at.setName("AT"); for (Field f : clazz.getDeclaredFields()) { f.setAccessible(true);//AccessibleTest類中的成員變數為private,故必須進行此操作 System.out.println(f.get(at));//獲取當前物件中當前Field的value } } }
不然就會報這個錯誤:
java.lang.IllegalAccessException:
Class com.test.accessible.Main
can not access
a member of class com.test.accessible.AccessibleTest
with modifiers "private"
當然在AccessibleTest類的內部(AccessibleTest的內部類除外)
進行如上操作則不需要呼叫setAccesible()方法