根据属性名获取 Field 对象Field f = clazz对象.getDeclaredField(属性名);
暴破:f.setAccessible(true); // f 是 Field
访问: f.set(o,值); // o 表示对象 syso(f.get(o)); // o 表示对象
注意:如果是静态属性,则 set 和 get 中的参数 o ,可以写成 null
packagereflection_;importjava.lang.reflect.Field;/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 9:29 2021/9/30
*/publicclassReflectAccessProperties{publicstaticvoidmain(String[] args)throwsClassNotFoundException,InstantiationException,IllegalAccessException,NoSuchFieldException{// 1. 得到 Student 类对应的 Class 对象Class<?> studentCls =Class.forName("reflection_.Student");// 2. 创建对象Object o = studentCls.newInstance();// 此处的 o 的运行类型就是 StudentSystem.out.println(o.getClass());// class reflection_.Student// 3. 使用反射得到 age 属性对象Field age = studentCls.getField("age");// getField() 获取 public 方法
age.set(o,21);// 通过反射来操作属性System.out.println(o);System.out.println(age.get(o));// 只返回 age 属性的值// 4. 使用反射操作 name 属性Field name = studentCls.getDeclaredField("name");// getDeclaredField() 获取任何方法
name.setAccessible(true);// IllegalAccessException,非法访问异常,因为 name 属性是 private的,要先进行爆破// name.set(o, "Sherry");
name.set(null,"Sherry");// 因为 name 属性是 static 的,static 属性是所有对象共享的,所以 o 也可以写成 nullSystem.out.println(o);System.out.println(name.get(o));// 只获取 name 属性的值}}classStudent{privatestaticString name;publicint age;publicStudent(){}@OverridepublicStringtoString(){return"Student = [ name = "+ name +" age = "+ age +" ]";}}
通过反射访问类中的成员根据属性名获取 Field 对象Field f = clazz对象.getDeclaredField(属性名);暴破:f.setAccessible(true); // f 是 Field访问:f.set(o,值); // o 表示对象syso(f.get(o)); // o 表示对象注意:如果是静态属性,则 set 和 get 中的参数 o ,可以写成 nullpackage reflection_;import java.lang.reflect.Fiel