Java 基礎【18】 反射與內省
阿新 • • 發佈:2018-12-07
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等,這裡就不贅述了。