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