首页 > 其他分享 >通过反射创建对象并获取对应的属性和方法

通过反射创建对象并获取对应的属性和方法

时间:2023-02-27 11:01:01浏览次数:39  
标签:反射 name int age 创建对象 id User public 属性

创建实体类

class User {
    private String name;
    private int id;
    private int age;

    public User() {
    }

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

    private void testUser() {}

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}

通过反射创建对象并获取对应的属性和方法

public class Test08 {
    public static void main(String[] args) {
        try {
            test();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class c1 = Class.forName("com.sty.reflection.User");

        // 1、创建对象
        User user = (User) c1.newInstance(); // 本质是调用了类的无参构造器
        System.out.println(user);

        // 2、通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        user = (User) constructor.newInstance("玲玲", 1, 18);
        System.out.println(user);

        /**
         * 通过反射调用普通方法
         * invoke (激活的意思),参数为:(对象,方法的值)
         */
        Method setName = c1.getMethod("setName", String.class);
        setName.invoke(user, "呼呼");
        System.out.println(user.getName());

        // 通过反射操作属性
        Field age = c1.getDeclaredField("age");
        // 不能直接操作私有属性,可以通过关闭成熟的安全检查,属性或方法通过设置 .setAccessible(true) 关闭
        age.setAccessible(true);
        age.set(user, 81);
        System.out.println(age.get(user));
    }
}

执行的结果为:

User{name='null', id=0, age=0}
User{name='玲玲', id=1, age=18}
呼呼
81

如何通过反射改变私有属性和方法

// 不能直接操作私有属性,可以通过关闭成熟的安全检查,属性或方法通过设置 .setAccessible(true) 关闭
age.setAccessible(true);

知识来源

动态创建对象的执行方法

标签:反射,name,int,age,创建对象,id,User,public,属性
From: https://www.cnblogs.com/styCy/p/17158894.html

相关文章