Reflect--反射(调用“运行时类中指定的内容”)

调用运行时类中指定的结果:属性、方法、构造器---(要掌握)

下面person类的代码块,属性,方法,构造器,都是这里面提供的
package _366After.src.javeTeacher.reflect.reflectionTest;


//给--reflection--来演示"大鱼吃小鱼"

public class Person {
    private String name;
    private String sex;
    private Integer age;

    public Person() {
    }

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

    public String show(String nation) {
        System.out.println("我的国籍是: "+nation);
        return nation;
    }

    public String eat() {
        return "吃饭";
    }

    //测试静态方法
    public static void showDesc(){
        System.out.println("我是一个可爱的人---测试静态方法");
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

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

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

}

问题1-:如何操作运行时类中的指定的"属性"---需要掌握

//问题1-:如何操作运行时类中的指定的"属性"---掌握
    @Test
    public void test() throws Exception {
        //1- 实例化"运行时类"
        Class<Person> classzz = Person.class;
        //2- 创建"运行时的对象"
        Person p = classzz.newInstance();
        //3- 获取"运行时类"中指定变量名的"属性"--getDeclaredField(String  name)
        Field name = classzz.getDeclaredField("name");
        //4- 保证当前属性是可以访问的
        name.setAccessible(true);
        //5- 获取、设置--指定对象的此属性值(运行时对象,改的值)
        name.set(p, "Tom");
        System.out.println(name.get(p));
    }

问题2-:如何操作运行时类中的指定的"方法"---需要掌握

 //问题2-:如何操作运行时类中的指定的"方法"---掌握
    @Test
    public void test2() throws Exception {
        //1- 实例化"运行时类"
        Class<Person> classzz = Person.class;
        //2- 创建"运行时的对象"
        Person p = classzz.newInstance();
        //3-获取运行时类的方法.getDeclaredMethod("你需要的方法名",参数的行参列表--括号内的 )
        Method show = classzz.getDeclaredMethod("show", String.class);
        //4- 保证当前属性是可以访问的
        show.setAccessible(true);
         //5--.invoke(方法的调用者,"实参数")
        // invoke的返回值,就是调用方法中的放回值
        Object returnValue = show.invoke(p, "Chinese");
        System.out.println(returnValue);

        System.out.println("——————————测试静态方法——————————————————————————");

        //1-同上--1- 实例化"运行时类"
        //2-同上--2- 创建"运行时的对象"
        //3-开始---获取运行时类的构造器.getDeclaredMethod(方法名,因为是static,所以只要方法吗名就可以)
        Method showDesc = classzz.getDeclaredMethod("showDesc");
        show.setAccessible(true);
        //如果调用的运行时类中的方法没有返回值,.invoke则返回null
        //todo  如果showDesc是private,就不行---和反射矛盾(待解决)
        Object returnValue2 = showDesc.invoke(null);
        System.out.println(returnValue2);
    }

问题3-:如何操作运行时类中的指定的"构造器"---需要掌握

@Test
    public void test3() throws Exception {
        //1- 实例化"运行时类"
        Class<Person> classzz = Person.class;
        //2-获取"指定的构造器"
        //public Person(String name, String sex, Integer age) {
        //.getDeclaredConstructor(参数:指明构造器的参数列表)
        //行参数有多少个,下面获得构造器也要写多少个,还要➕. class
        Constructor declaredConstructor = classzz.getDeclaredConstructor(String.class, String.class,Integer.class);
        //3- 保证可以反问
        declaredConstructor.setAccessible(true);
        //4- 创建运行时类的构造器
        Person person = (Person) declaredConstructor.newInstance("tom", "nan", 13);
        System.out.println(person);
    }

posted on 2022-06-17 11:36  陈嘻嘻-  阅读(26)  评论(0编辑  收藏  举报

导航