Java反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

一、获取对象的所有公共属性

在Java中,我们可以使用`getFields`方法来获取某个类的所有public属性,包括其父类的public属性。

 public class Sample { public int a; private int b; } public class Main { public static void main(String[] args) { // 创建对象 Sample s = new Sample(); // 获取类对象 Class c = s.getClass(); // 获取所有公共属性 Field[] fields = c.getFields(); //打印公共属性 for (Field field : fields) { System.out.println(field.getName()); } } 

二、获取对象的所有私有属性

类的私有属性只能在本类中访问,通过`getDeclaredFields`方法,我们可以访问类的所有字段,不考虑修饰符。

 public class Sample { public int a; private int b; } public class Main { public static void main(String[] args) { // 创建对象 Sample s = new Sample(); // 获取类对象 Class c = s.getClass(); // 获取所有私有和公共属性 Field[] fields = c.getDeclaredFields(); //打印所有属性 for (Field field : fields) { System.out.println(field.getName()); } } 

三、获取特定属性和读取属性值

如果我们知道某个属性的名称,就可以直接获取这个属性,然后读取或修改它的值。具体的操作方法如下:

 public class Sample { public int a; private int b; } public class Main { public static void main(String[] args) throws Exception { // 创建对象 Sample s = new Sample(); // 获取类对象 Class c = s.getClass(); // 获取指定的属性 Field field = c.getField("a"); // 获取属性值 int value = (int) field.get(s); // 打印属性值 System.out.println(value); } 

上面的代码可以获取public属性a的值,如果要获取private属性b的值,就需要先调用`field.setAccessible(true);`来关闭Java的安全检查,这样就可以访问private属性。注意,如果不这样做,尝试访问private属性将会抛出`IllegalAccessException`。