这两个方法都是用于获取字段
- getField 只能获取public的,包括从父类继承来的字段。
- getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
Person实体类:
package reflex;
/**
* @author: 邹祥发
* @date: 2021/11/1 11:28
*/
public class Person {
//private修饰的成员变量不能直接通过反射操作
private int age;
//public修饰的成员变量可以直接通过反射操作
public int money;
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public Person(int age, int money) {
this.age = age;
this.money = money;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", money=" + money +
'}';
}
}
演示getField和getDeclaredField:
package reflex;
import java.lang.reflect.Field;
/**
* @author: 邹祥发
* @date: 2021/11/1 11:29
* 通过反射操作成员变量
*/
public class ReflexDemo01 {
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("reflex.Person");
//操作private修饰的成员变量
Field age = aClass.getDeclaredField("age");
Person person = new Person();
//忽略访问权限修饰符的安全检查
age.setAccessible(true);//暴⼒反射,私有成员变量的要加这个
Object value = age.get(person);
System.out.println("age初始值:" + value);
age.set(person, 18);
System.out.println(person);
//操作public修饰的成员变量
Field money = aClass.getField("money");
Person person1 = new Person();
Object value1 = money.get(person1);
System.out.println("money初始值:" + value1);
money.set(person1, 100);
System.out.println(person1);
}
}
运行结果:
age初始值:0
Person{age=18, money=0}
money初始值:0
Person{age=0, money=100}
使用反射的优缺点:
优点:
1:能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性;
2:与java动态编译相结合,可以实现无比强大的功能。
缺点:
1:使用反射的性能较低;
2:使用反射来说相对不安全;
3:破坏了类的封装性,可以通过反射来获取这个类的属性,和私有方法。

评论区 0