【java基礎】從反射開始(Reflection)

Java學習筆記 https://github.com/SnailDev/java-learning 和我一塊兒啓程...java


 

反射(Reflection)

  • 定義

在運行狀態中, 對於任意的一個類,都可以知道這個類的全部屬性和方法; 對於任意的一個對象,都可以調用他的任意一個方法和屬性; 這種動態獲取類的信息以及動態調用對象的方法的功能稱作Java的反射機制。git

  • 功能
  1. 只要給定類的全名,便可獲取類的所用信息;
  2. 運行時獲取任意一個對象所屬的類對象;
  3. 運行時獲取類中全部屬性對象,可對其操做(包含私有屬性);
  4. 運行時獲取類中、父類中全部方法,可對其調用。
  • 應用

目前主流的應用框架如Struts二、Hibernate、Spring、SpringMVC等的核心所有都是利用Java的反射機制來實現的。github

  • 組成
  1. Class
  2. Constructor
  3. Field
  4. Method
類的類型(Class)
  • 經常使用方法
  1. getName() 得到類中完整名稱
  2. getDeclaredFields() 獲取類中全部屬性(含私有)
  3. getDeclaredMethods() 獲取類中全部方法(含私有)
  4. getConstructors() 獲取類的構造方法(不含私有)
  5. newInstance() 實例化類的對象(類的構造方法中參數需爲空)
  • 獲取Class對象的方式
  1. 利用Class類forName()靜態方法傳入一個類的全路徑來返回相對應的Class對象;
  2. 將實例化的類對象轉成Object對象,再經過Object對象的getClass()方法來返回對應類的Class對象;
  3. 經過類的class屬性來返回類的Class對象。

      即數組

  1. Class.forName("要加載的類名")
  2. 對象名.getClass()
  3. 類名.class
  • 反射的大體流程
  1. 用上述三種方式之一獲取特定類的Class類,即該類對應的字節碼
  2. 調用Class對象的getConstructor(Class<?>... parameterTypes)獲取構造方法對象
  3. 調用是構造方法類Constructor的newInstance(Object... initargs)方法新建對象
  4. 調用Class對象的getMethod(String name, Class<?>... parameterTypes)獲取方法對象(用方法的參數類型惟一標識一個方法,依據:方法的重載)
  5. 調用方法對象類Method的invoke(Object obj, Object... args)方法,調用對象上相應方法
類的構造方法(Constructor)

類的構造函數反射類,經過getConstructors()方法能夠得到類的全部構造函數反射對象數組。其中最主要的一個方法就是newInstance(),經過該方法能夠建立一個對象類的實例,至關於new關鍵字。bash

類、接口的屬性對象(Field)
  • 經常使用方法
  1. getName() 獲取屬性名稱
  2. getType() 獲取屬性類型
  3. get(Object obj) 獲取obj對象中這個屬性的值
  4. set(Object obj, Object value) 向obj對象中這個屬性賦值value
  5. setAccessible(boolean flag) 啓用/禁用訪問控制權限
  • Class對象中獲取Field對象
  1. Field[] getDeclareFields() 獲取類中全部的屬性信息(含私有)
  2. Field[] getFields() 獲取類中全部的公共屬性信息(即不含私有)
類、接口的方法對象(Method)
  • 經常使用方法
  1. getName() 獲取方法名稱
  2. getReturnType() 獲取方法返回類型
  3. invoke(Object obj,Obeject... args) 利用obj對象調用該方法
  4. getParameterTypes() 獲取方法全部參數類型,按照順序返回Class數組
  5. getDeclaredAnnotations() 獲取方法的全部註解
  • Class對象中獲取Method對象
  1. Method[] getDeclareMethods() 獲取類中全部的方法信息(含私有);
  2. Method[] getMethod(String name, Class<?>... paramterTypes) 獲取某個特定的方法,第一個參數爲方法名稱,第二個參數爲方法參數的類對象(當方法具備多個參數時,傳入的是Class數組;當方法參數爲0個時,傳入null);
其餘實踐
  • 數組的反射框架

    • 對於元素同類型的數組,同維數組,class同樣
    • 不一樣維的,class不一樣
    • 不一樣維的,父類都是Object,同樣
    • 基本類型一維數組不能直接轉換爲Object[]
    • java.util.Arrays的 asList 方法留意下
  • hashCode 與內存泄漏問題函數

    • hashCode 一旦生成,不要變
    • 對象equals()方法返回true,則hashCode()返回要保持一致
    • 反之,equals()方法返回false, 則hashCode()不必定返回false
  • 內省(Introspector) & JavaBean工具

    JavaBean-是一種特殊的Java類,主要用於傳遞數據信息,這種java類中的方法主要用於訪問私有的字段,且方法名符合某種命名規則。學習

    JavaBean的分類spa

    1. 俠義的JavaBean
      • 私有的字段(Field)
      • 對私有字段提供存取方法(讀寫方法)
    2. 廣義的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 和我一塊兒啓程...

相關文章
相關標籤/搜索