1. 程式人生 > >Java 基礎【18】 反射與內省

Java 基礎【18】 反射與內省

1.反射和內省的概念定義

   Java 反射機制容許程式在執行時載入、探知、使用編譯期間完全未知的 class,核心類 java.lang.Class。

   通過把指定的類中各種元素成分都對映成 java.lang.reflect 反射包中的相應類,使得我們可以動態的呼叫類的相應成員.比如構造方法、成員方法、成員變數等。

        //JDK 反射API
        public static Class<?> forName(String className)

        //通過配置靈活載入不同資料庫驅動
Class.forName(driver);

   執行時獲取任意類的成員方法:

        Class<String> stringClass = String.class;
        //獲取宣告的所有方法(不包括繼承方法)
        Method[] methods = stringClass.getDeclaredMethods();
        //獲取所有方法
        Method[] methods1 = stringClass.getMethods();
        //獲取特定方法
Method indexOf = stringClass.getMethod("indexOf", int.class);

   執行時獲取任意類的成員變數:

        //獲取所有類屬性
        Field[] fields = stringClass.getFields();
        //獲取宣告的所有成員屬性(不包括繼承屬性)
        Field[] declaredFields = stringClass.getDeclaredFields();
        //獲取特定欄位
        Field hashField = stringClass.getDeclaredField("hash");

   執行時呼叫任意類的方法:

        Constructor<String> constructor = stringClass.getConstructor(String.class);
        String newInstance = constructor.newInstance("orson");
        Object invoke = indexOf2.invoke(newInstance, "n");

   在執行時例項化物件並訪問對應欄位和方法比直接 new 一個物件來操作到底有什麼好處呢?

   最主要的是提高靈活性和可擴充套件性, Spring 託管類、Struts 請求對映 Action、Hibernate 填充實體屬性這些過程,反編譯原始碼你都會看到反射。

   通過修改配置檔案類檔案的“描述”,不需要修改程式碼和編譯,進行動態有必要的載入。

   很多開源專案都對 JDK 底層反射進行了封裝,提供了簡潔的 API 介面方便使用,如 apache-common、hutool等,這裡就不贅述了。