【入门】反射基本操作

前言

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。
通过反射你可以获取任意一个类的所有属性方法,你还可以调用这些方法和属性。

来自:JavaGuide

应用场景

  • 动态代理
  • 注解 (思考一下为什么,你写一个@Component,Spring就会帮你管理这个Bean?
            Class<User> userClass = User.class;
            Annotation[] annotations = userClass.getAnnotations();
            for (Annotation annotation : annotations) {
                // 这一步骤可以处理好多事情
                System.out.println(annotation.annotationType());
            }

示例

public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}



public class App2 {
    public static void main(String[] args) {
        Class<User> userClass = User.class;

        User user = null;
        try {
            // 通过反射实例化对象
            user = userClass.newInstance();
            user.setName("测试1");
            System.out.println(user.getName()); // 测试1

            // 获取方法
            Method setName = userClass.getDeclaredMethod("setName", String.class);
            setName.invoke(user,"测试2");
            System.out.println(user.getName()); // 测试2

            // 获取private属性,并设置值
            Field name = userClass.getDeclaredField("name");
            name.setAccessible(true);
            name.set(user, "测试3");
            System.out.println(user.getName()); // 测试3
            
            Field[] declaredFields = userClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                System.out.println(declaredField.getName());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

总结

反射,可以根据类元信息,访问、修改、获取一些对象的信息。

posted @ 2023-06-18 01:03  帅气的涛啊  阅读(6)  评论(0编辑  收藏  举报