反射調用方法,實例化對象,字段賦值

準備一個類,有參構造方法,字段,方法都是私有的

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

    private Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    private void say() {
        System.out.println("我是一隻貓");
    }

    @Override
    public String toString() {
	     System.out.println("Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}');
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

####通過反射獲取私有的構造方法

	@Test
    public void reflex1() throws Exception {
        //獲取字節碼文件
        Class<Cat> clazz = Cat.class;
        //獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
        Constructor<Cat> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
        //使用時取消 Java 語言訪問檢查
        constructor.setAccessible(true);
        //傳參
        Cat cat = constructor.newInstance("咖菲貓", 10);
        System.out.println(cat);
    }

控制檯打印:
Cat{name=‘咖菲貓’, age=10}
####通過反射獲取類的字段並賦值

    @Test
    public void reflex2() throws Exception {
        //獲取字節碼文件
        Class<Cat> clazz = Cat.class;
        //獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
        Constructor<Cat> constructor = clazz.getDeclaredConstructor();
        //使用時取消 Java 語言訪問檢查
        constructor.setAccessible(true);
        //實例化對象
        Cat cat = constructor.newInstance();
        //獲取所有字段數組
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //打印字段名和類型
            System.out.println("字段名=" + field.getName() + "字段類型=" + field.getType());
            field.setAccessible(true);
            if (field.getType().equals(String.class)) {
                field.set(cat, "咖菲貓");
            }
            if (field.getType().equals(Integer.class)) {
                field.set(cat, 11);
            }
        }
        System.out.println(cat);
    }

控制檯打印:
字段名=name字段類型=class java.lang.String
字段名=age字段類型=class java.lang.Integer
Cat{name=‘咖菲貓’, age=11}
####通過反射獲取所用方法,並且調用

    @Test
    public void reflex3() throws Exception {
        //獲取字節碼文件
        Class<Cat> clazz = Cat.class;
        //獲取參數第一個爲String類型和第二個爲Integer類型的構造方法
        Constructor<Cat> constructor = clazz.getDeclaredConstructor();
        //使用時取消 Java 語言訪問檢查
        constructor.setAccessible(true);
        //實例化對象
        Cat cat = constructor.newInstance();
        //獲取所有方法名 但不包括繼承的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名=" + method.getName());
            //使用時取消 Java 語言訪問檢查
            method.setAccessible(true);
            //調用方法
            method.invoke(cat);
        }
    }

控制檯打印:
方法名=toString
Cat{name=‘null’, age=null}
方法名=say
我是一隻貓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章