1. 程式人生 > >反射取子類、父類 屬性

反射取子類、父類 屬性

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()方法