通过反射机制获取成员变量并使用
创建Class对象:Class clazz = Class.forName(“包名(级路径).类名”); 获取成员变量: 1)、Field f = clazz.getField(“变量名”); //获取公有的成员变量。f.set(变量值); //设置该变量名的变量值 2)、Field f = clazz.getDeclaredField(“字段名”); //获取私有的成员变量。f.setAccessible(true); //强制访问,忽略修饰符。f.set(变量值); getField和getDeclaredField的区别 1)、getField 只能获取public的,包括从父类继承来的字段。 2)getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true)来忽略修饰符 案例加强理解:
package com.impl.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class Class04 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
//创建Class对象,对User02类进行实例化
Class clazz = Class.forName("com.impl.reflection.User02");
//获取有参构造方法对象
Constructor<?> cn = clazz.getConstructor(String.class,Integer.class,Integer.class);
//获取实际参数对象
User02 us = (User02) cn.newInstance("我是未修改的",18515022,24);
System.out.println("初始化对象时的数据"+us);
//获取私有的字段名
Field f1 = clazz.getDeclaredField("name");
f1.setAccessible(true);//强制访问私有的成员变量
f1.set(us,"我是修改的");//设置该私有成员变量的值
//获取私有的字段名
Field f2 = clazz.getDeclaredField("id");
f2.setAccessible(true);//强制访问私有的成员变量
f2.set(us,185150224);
//获取公共的成员变量
Field f3 = clazz.getField("age");
f3.set(us,23);
//输出修改后的参数值
System.out.println("通过反射机制获取并修改后的结果" + us);
}
}
class User02{
private String name;
private Integer id;
public Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public User02(String name, Integer id, Integer age) {
this.name = name;
this.id = id;
this.age = age;
}
@Override
public String toString() {
return "User02{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}';
}
}