Java學習筆記 https://github.com/SnailDev/java-learning 和我一塊兒啓程...java
在運行狀態中, 對於任意的一個類,都可以知道這個類的全部屬性和方法; 對於任意的一個對象,都可以調用他的任意一個方法和屬性; 這種動態獲取類的信息以及動態調用對象的方法的功能稱作Java的反射機制。git
- 只要給定類的全名,便可獲取類的所用信息;
- 運行時獲取任意一個對象所屬的類對象;
- 運行時獲取類中全部屬性對象,可對其操做(包含私有屬性);
- 運行時獲取類中、父類中全部方法,可對其調用。
目前主流的應用框架如Struts二、Hibernate、Spring、SpringMVC等的核心所有都是利用Java的反射機制來實現的。github
- Class
- Constructor
- Field
- Method
- getName() 得到類中完整名稱
- getDeclaredFields() 獲取類中全部屬性(含私有)
- getDeclaredMethods() 獲取類中全部方法(含私有)
- getConstructors() 獲取類的構造方法(不含私有)
- newInstance() 實例化類的對象(類的構造方法中參數需爲空)
- 利用Class類forName()靜態方法傳入一個類的全路徑來返回相對應的Class對象;
- 將實例化的類對象轉成Object對象,再經過Object對象的getClass()方法來返回對應類的Class對象;
- 經過類的class屬性來返回類的Class對象。
即數組
- Class.forName("要加載的類名")
- 對象名.getClass()
- 類名.class
- 用上述三種方式之一獲取特定類的Class類,即該類對應的字節碼
- 調用Class對象的getConstructor(Class<?>... parameterTypes)獲取構造方法對象
- 調用是構造方法類Constructor的newInstance(Object... initargs)方法新建對象
- 調用Class對象的getMethod(String name, Class<?>... parameterTypes)獲取方法對象(用方法的參數類型惟一標識一個方法,依據:方法的重載)
- 調用方法對象類Method的invoke(Object obj, Object... args)方法,調用對象上相應方法
類的構造函數反射類,經過getConstructors()方法能夠得到類的全部構造函數反射對象數組。其中最主要的一個方法就是newInstance(),經過該方法能夠建立一個對象類的實例,至關於new關鍵字。bash
- getName() 獲取屬性名稱
- getType() 獲取屬性類型
- get(Object obj) 獲取obj對象中這個屬性的值
- set(Object obj, Object value) 向obj對象中這個屬性賦值value
- setAccessible(boolean flag) 啓用/禁用訪問控制權限
- Field[] getDeclareFields() 獲取類中全部的屬性信息(含私有)
- Field[] getFields() 獲取類中全部的公共屬性信息(即不含私有)
- getName() 獲取方法名稱
- getReturnType() 獲取方法返回類型
- invoke(Object obj,Obeject... args) 利用obj對象調用該方法
- getParameterTypes() 獲取方法全部參數類型,按照順序返回Class數組
- getDeclaredAnnotations() 獲取方法的全部註解
- Method[] getDeclareMethods() 獲取類中全部的方法信息(含私有);
- Method[] getMethod(String name, Class<?>... paramterTypes) 獲取某個特定的方法,第一個參數爲方法名稱,第二個參數爲方法參數的類對象(當方法具備多個參數時,傳入的是Class數組;當方法參數爲0個時,傳入null);
數組的反射框架
hashCode 與內存泄漏問題函數
內省(Introspector) & JavaBean工具
JavaBean-是一種特殊的Java類,主要用於傳遞數據信息,這種java類中的方法主要用於訪問私有的字段,且方法名符合某種命名規則。學習
JavaBean的分類spa
- 俠義的JavaBean
- 私有的字段(Field)
- 對私有字段提供存取方法(讀寫方法)
- 廣義的JavaBean
- 私有的字段(Field)
- 對私有字段提供存取方法(讀寫方法)
- 數量任意的業務方法
內省(IntroSpector)是Java語言對JavaBean 類屬性、事件的一種處理方法。
JavaBean讀取屬性x的值的流程:變大寫、補前綴、獲取方法。
"x"-->"X"-->"getX"-->"MethodGetX"
- 簡單實現 使用java.beans.PropertyDescriptor類
- 複雜實現 使用java.beans.Introspector類,遍歷getBeanInfo方法的返回值
- 使用BeanUtils工具包
- 字符串和整數轉換(對比(PropertyUtils)
- 屬性級聯操做
- 操做map
Java學習筆記 https://github.com/SnailDev/java-learning 和我一塊兒啓程...