反射

1.什么是反射:在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

第一步 我们先创建一个类

//实体类 entity
public class User{
    private  int id;
    private String name;
    private int age;

    public User() {
    }

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

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

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

 

第二步操作这个user类  

//动态的创建对象,通过反射
public class Test06 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //Class.forName获取User的class类
        Class c1 = Class.forName("hj.reflections.User");

        //通过User的calss类调用newInstance方法构造一个对象 
        User user = (User) c1.newInstance(); //本质是调用了类的无参构造器
        System.out.println(user);

        //通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(int.class,String.class,int.class);//获取对象的构造器
        User user1 =(User) constructor.newInstance(10,"小黄",  20);//创建对象
        System.out.println(user1);

        //通过反射调用方法,先创建一个对象
        User user3 = (User) c1.newInstance();
        //通过反射获取setName方法
        Method setName = c1.getMethod("setName", String.class);
        //invoke:激活的意思(对象,方法的值)
        setName.invoke(user3,"啊黄");
        System.out.println(user3);

        //通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        //不能操作私有属性,我们需要关闭程序的安全检测,属性或者方法的setAccessible(true)
        name.setAccessible(true);
        name.set(user4,"啊俊");
        System.out.println(user4);


    }
}

 

posted @ 2022-05-27 10:07  不想当将军的好士兵  阅读(27)  评论(0)    收藏  举报