在我们上面自定义的ReflectTarget类中创建各种不同访问修饰符修饰的字段,用于测试 // --------字段-------- public String name; protected int index; char type; private String targetInfo; @Override public String toString() { return "ReflectTarget{" + "name='" + name + '\'' + ", index=" + index + ", type=" + type + ", targetInfo='" + targetInfo+ '\'' + '}'; }
新创建一个类FieldCollector 测试通过反射获取目标反射类的所有成员变量 package demo.reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; /** * 获取成员变量并调用: * 1)批量的 * Field[] getFields() 获取所有的”公有字段” * Field[] getDeclaredFields() 获取所有字段(包括私有的、受保护的、默认和公有的) * 2)获取单个的 * public Field getField(String fieldName) 获取单个的”公有的“字段 * public Field getDeclaredField(String fieldName) 获取某个字段(可以是私有的、受保护的、默认和公有的) * * 设置字段值: Field --> public void set(Object obj,Object value) * 参数说明: * 1. obj:要设置的字段所对应的对象 * 2. value:要为字段设置的值 */ public class FieldCollector { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //获取class对象 Class reflectTargetClass = Class.forName("demo.reflect.ReflectTarget"); //获取所有的公有字段 System.out.println("**************获取所有的公有字段**************"); Field[] fieldArray = reflectTargetClass.getFields(); for (Field field : fieldArray) { System.out.println(field); } //获取所有的字段 System.out.println("**************获取所有字段(包括私有的、受保护的、默认和公有的)**************"); fieldArray = reflectTargetClass.getDeclaredFields(); for (Field field : fieldArray) { System.out.println(field); } // 获取公有字段并赋值 System.out.println("**************获取公有字段并赋值**************"); Field field = reflectTargetClass.getField("name"); System.out.println("公有的字段 name = " + field); // 通过反射调用无参构造方法,并使用无参构造创建对象 ReflectTarget reflectTarget = (ReflectTarget)reflectTargetClass.getConstructor().newInstance(); // 给获取对象的field属性赋值 field.set(reflectTarget,"待反射一号"); // 验证对应的值 name System.out.println("验证name: " + reflectTarget.name); // 因为name属性是公有的,所以可以直接通过实例调用 System.out.println("**************获取私有字段targetInfo并赋值**************"); field = reflectTargetClass.getDeclaredField("targetInfo"); System.out.println(field); field.setAccessible(true); // 设置暴力访问 field.set(reflectTarget,"13730862985"); // 因为targetInfo属性是私有的,不能直接通过实例调用,由于我们重写了toString方法,所以直接打印reflectTarget对象就好了 System.out.println("验证targetInfo: " + reflectTarget); } } /** * 运行结果如下: * **************获取所有的公有字段************** * public java.lang.String demo.reflect.ReflectTarget.name * **************获取所有字段(包括私有的、受保护的、默认和公有的)************** * public java.lang.String demo.reflect.ReflectTarget.name * protected int demo.reflect.ReflectTarget.index * char demo.reflect.ReflectTarget.type * private java.lang.String demo.reflect.ReflectTarget.targetInfo * **************获取公有字段并赋值************** * 公有的字段 name = public java.lang.String demo.reflect.ReflectTarget.name * 调用了公有的无参构造函数。。。 * 验证name: 待反射一号 * **************获取私有字段targetInfo并赋值************** * private java.lang.String demo.reflect.ReflectTarget.targetInfo * 验证targetInfo: ReflectTarget{name='待反射一号', index=0, type= , targetInfo='13730862985'} */
注意:通过getField()方法可以获取到从父类继承的公有字段,但getDeclareField()方法是获取不到从父类继承的字段的
如何获取类的方法并调用