1. 程式人生 > >反射呼叫方法,例項化物件,欄位賦值

反射呼叫方法,例項化物件,欄位賦值

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

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

    private Car(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    private void say() {
        System.out.println("我是一隻貓");
    }

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

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

    @Test
    public
void reflex1() throws Exception { //獲取位元組碼檔案 Class<Car> clazz = Car.class; //獲取引數第一個為String型別和第二個為Integer型別的構造方法 Constructor<Car> constructor = clazz.getDeclaredConstructor(String.class, Integer.class); //使用時取消 Java 語言訪問檢查 constructor.setAccessible(true
); //傳參 Car car = constructor.newInstance("咖菲貓", 10); System.out.println(car); }

控制檯列印:
Car{name=’咖菲貓’, age=10}

通過反射獲取類的欄位並賦值

    @Test
    public void reflex2() throws Exception {
        //獲取位元組碼檔案
        Class<Car> clazz = Car.class;
        //獲取引數第一個為String型別和第二個為Integer型別的構造方法
        Constructor<Car> constructor = clazz.getDeclaredConstructor();
        //使用時取消 Java 語言訪問檢查
        constructor.setAccessible(true);
        //例項化物件
        Car car = 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(car, "咖菲貓");
            }
            if (field.getType().equals(Integer.class)) {
                field.set(car, 11);
            }
        }
        System.out.println(car);
    }

控制檯列印:
欄位名=name欄位型別=class java.lang.String
欄位名=age欄位型別=class java.lang.Integer
Car{name=’咖菲貓’, age=11}

通過反射獲取所用方法,並且呼叫

    @Test
    public void reflex3() throws Exception {
        //獲取位元組碼檔案
        Class<Car> clazz = Car.class;
        //獲取引數第一個為String型別和第二個為Integer型別的構造方法
        Constructor<Car> constructor = clazz.getDeclaredConstructor();
        //使用時取消 Java 語言訪問檢查
        constructor.setAccessible(true);
        //例項化物件
        Car car = constructor.newInstance();
        //獲取所有方法名 但不包括繼承的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名=" + method.getName());
            //使用時取消 Java 語言訪問檢查
            method.setAccessible(true);
            //呼叫方法
            method.invoke(car);
        }
    }

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