class Person {
int age = 6;         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());
}
}输出结果为什么不一致?

解决方案 »

  1.   

    getInfo返回Person类的age这没有歧义;
    getInfo2返回Student类的age是因为:
    Class clazz=this.getClass();这行代码得到的类其实是Student,如果把这行代码改为:
    Class clazz=Person.class;结果就一样了;
      

  2.   

    谢谢2楼,但是我有一个问题,通过反射方式,我怎么能既得到父类属性又得到子类属性?
    比如:父类有name属性,子类有age属性
    Class clazz=this.getClass();只能得到子类的属性
    Class clazz = Class.forName("test.Person");只能得到父类的属性
      

  3.   

    对于成员变量,具体值隶属于class命名空间,
    如果 Class.forName("test.Student");就能取到子类的值了
      

  4.   

    我不懂反射。
    在Student类里面的两个方法中,我加入了打印this的语句。
    执行Test2 的main方法时,这些语句都显示this是Student 
      

  5.   

    1)Class.getFields() 方法可以得到本类及其超类的所有可访问公共字段(public);
    2)如果这些字段不是public的, 你可以 用 Class.getDeclaredFields()这个方法取得本类所有字段,  再用Class.getSuperclass()取得其超类,并用Class.getDeclaredFields()取得超类的所有字段;