目录
还是创建student测试类
public class Student {
private int age;
private String name;
String sex;
public Student(int age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
1、普通反射修改
public class Reflections {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Student s = new Student(1,"张三","男");
Class cls = s.getClass();//Class.forName (" 权限定名") 包名+类名
Field[] fields = cls.getDeclaredFields();//获取所有类属性
Method[] methods = cls.getDeclaredMethods();//获取所有方法
System.out.println("类名:"+ cls.getName());//获取所有类名
System.out.println("属性:");
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].toString());
}
System.out.println("方法名:");
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i].toString());
}
Field fname = cls.getDeclaredField("name");//获取指定名称的域
Field fage = cls.getDeclaredField("age");//获取指定名称的域
Field fsex = cls.getDeclaredField("sex");//获取指定名称的域
fsex.set(s,"女");//修改指定对象s的sex信息;
System.out.println("修改后:"+s.toString());
fname.set(s,"李四");//修改指定对象s的name信息;
fage.set(s,30);//修改指定对象s的age信息;
System.out.println("修改后:"+s.toString());
}
}
执行代码:可知在修改性别后,输出,信息被成功修改;但是其他属性的修改,却报错了,
查看报错信息
会发现 age 和name的属性是private 不能直接修改,需用 setAccessible(true)设置
2、暴力反射
加上setAccessible(true)代码后
public class Reflections {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Student s = new Student(1,"张三","男");
Class cls = s.getClass();//Class.forName (" 权限定名") 包名+类名
Field[] fields = cls.getDeclaredFields();//获取所有类属性
Method[] methods = cls.getDeclaredMethods();//获取所有方法
System.out.println("类名:"+ cls.getName());//获取所有类名
System.out.println("属性:");
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].toString());
}
System.out.println("方法名:");
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i].toString());
}
Field fname = cls.getDeclaredField("name");//获取指定名称的域
Field fage = cls.getDeclaredField("age");//获取指定名称的域
Field fsex = cls.getDeclaredField("sex");//获取指定名称的域
fsex.set(s,"女");//修改指定对象s的sex信息;
System.out.println("修改后:"+s.toString());
fname.setAccessible(true);//
fage.setAccessible(true);
fname.set(s,"李四");//修改指定对象s的name信息;
fage.set(s,30);//修改指定对象s的age信息;
System.out.println("修改后:"+s.toString());
}
}
运行结果
程序被正常修改。