getField和getDeclaredField的区别

  Java   5分钟   347浏览   0评论

这两个方法都是用于获取字段

  1. getField 只能获取public的,包括从父类继承来的字段
  2. 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 条评论