反射 動態加載類,獲取構造函數、方法、成員

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class DynamicClass {

    private String name;
    private String sex;

    public static void main(String[] args) throws ClassNotFoundException {
        /*
         * 萬事萬物皆對象
         * 所有的類都是Class類的對象,所有的方法都是Method類的對象,所有的
         * 每個類都存在class的靜態成員參數
         * 表示類的唯一標識   類類型
         */
        System.out.println("DynamicClass .class : " + DynamicClass.class);
        /*
         * 每個類的對象,都具有一個getClass方法  用來獲取類類型
         * 類類型是Class類的對象
         */
        System.out.println("DynamicClass .getClass : " + new DynamicClass().getClass());
        /*
         * 一個類的類類型是唯一的,也是一個定值。相同的類的類類型是相等的。
         */
        System.out.println(DynamicClass.class == new DynamicClass().getClass());

        /*
         * 通過Class.forName方法獲取的類類型
         */
        Class dynamicClass = Class.forName("com.haut.zm.test.DynamicClass");

        System.out.println("Class forName : " + dynamicClass);

        System.out.println("=========================");

        /*
         * 獲取類自己所有的方法,不包含繼承方法
         */
        Method[] methods = dynamicClass.getDeclaredMethods();
        /*
         * lambda也是method方法的一個對象
         */
        Arrays.stream(methods).forEach(method -> {
            System.out.println("++++++++++++");
            System.out.println(method.getName());
            /*
             * 方法返回類型  如果沒有返回值是void的,說明void也是Class類的類類型
             */
            System.out.println("returnType : " + method.getAnnotatedReturnType().getType());
            Class[] parameterTypes = method.getParameterTypes();
            for(Class parameterType : parameterTypes) {
                System.out.print("parameterType : " + parameterType.getName() + "\t");
                System.out.println();
            }
            System.out.println();
        });

        System.out.println("--------------");

        /*
         * 獲取所有的成員變量信息
         */
        Field[] fields = dynamicClass.getDeclaredFields();
        System.out.println("field : ");
        for(Field field : fields) {
            System.out.print(field.getName() + " : " + field.getType() + "\t");
        }

        System.out.println();
        System.out.println("****************");

        /*
         * 構造方法,及參數類型
         */
        Constructor[] declaredConstructors = dynamicClass.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName());
            for (Class parameterType : declaredConstructor.getParameterTypes()) {
                System.out.println(parameterType.getName());
            }
        }

        System.out.println("^^^^^^^^^^^^^^^^");

        /*
         * 動態加載類
         */
        try {
            Class c = Class.forName("com.haut.zm.test.Word");
            OfficeAble officeAble = (OfficeAble) c.newInstance();
            officeAble.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private DynamicClass(){}

    public DynamicClass(String name) {
        this.name = name;
    }

    public DynamicClass(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    private void print(String print) {
        System.out.println("print : " + print);
    }

    private void print(String print, int type, String name) {
        System.out.println(name + print + type);
        System.out.println(int.class);
    }
}

interface OfficeAble{
    void start();
}

class Word implements OfficeAble{

    @Override
    public void start() {
        System.out.println("word start...");
    }
}

class Excel implements OfficeAble{

    @Override
    public void start() {
        System.out.println("excel start...");
    }
}

 

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