【Android】 認識反射機制(Reflection)

慢慢的燃燒發表於2017-03-23


什麼是反射機制

JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制(注意關鍵詞:執行狀態)換句話說,Java程式可以載入一個執行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其物件實體、或對其fields設值、或喚起其methods

反射機制主要提供的功能

  • 在執行時判斷任意一個物件所屬的類;
  • 在執行時構造任意一個類的物件;
  • 在執行時判斷任意一個類所具有的成員變數和方法;
  • 在執行時呼叫任意一個物件的方法;

java Reflection API簡介

  • Class類:代表一個類,位於java.lang包下
  • Field類:代表類的成員變數(成員變數也稱為類的屬性)
  • Method類:代表類的方法
  • Constructor類:代表類的構造方法
  • Array類:提供了動態建立陣列,以及訪問陣列的元素的靜態方法

java中的Class介紹

Class 類十分特殊,它沒有共有的構造方法,被jvm呼叫的(簡單的理解:new物件或者被類載入器載入的時候),在Java中,每個class都有一個相應的Class物件。也就是說,當我們編寫一個類,編譯完成後,在生成的.class檔案中,就會產生一個Class物件,用於表示這個類的型別資訊。

java中的Class三種獲取方式

  • 利用物件呼叫getClass()方法獲取該物件的Class例項;
  • 使用Class類的靜態方法forName(),用類的名字獲取一個Class例項 ;
  • 運用.class的方式來獲取Class例項,對於基本資料型別的封裝類,還可以採用.TYPE來獲取相對應的基本資料型別的Class例項;

說明:在執行期間,如果我們要產生某個類的物件,Java虛擬機器(JVM)會檢查該型別的Class物件是否已被載入。如果沒有被載入,JVM會根據類的名稱找到.class檔案並載入它。一旦某個型別的Class物件已被載入到記憶體,就可以用它來產生該型別的所有物件。

java中的Class中一些重要的方法

  • public Annotation[] getAnnotations () 獲取這個類中所有註解

  • getClassLoader() 獲取載入這個類的類載入器

  • getDeclaredMethods() 獲取這個類中的所有方法

  • getReturnType() 獲取方法的返回型別

  • getParameterTypes() 獲取方法的傳入引數型別

  • isAnnotation() 測試這類是否是一個註解類

  • getDeclaredConstructors() 獲取所有的構造方法

  • getDeclaredMethod(String name, Class… parameterTypes) 獲取指定的構造方法(引數:引數型別.class)

  • getSuperclass() 獲取這個類的父類

  • getInterfaces() 獲取這個類實現的所有介面

  • getFields() 獲取這個類中所有被public修飾的成員變數

  • getField(String name) 獲取指定名字的被public修飾的成員變數

  • newInstance() 返回此Class所表示的類,通過呼叫預設的(即無引數)建構函式建立的一個新例項

等等方法

如何通過反射獲取私有成員變數和私有方法

Person類

執行結果:
yyc_12yyc_12

獲取私有方法的方式類似獲取私有成員變數的方式 
Filed類,Method類等詳細檢視開發者文件:
http://developer.android.com/intl/zh-cn/reference/java/lang/reflect/Field.html

案例演示反射

Person類

SuperPerson類

Smoke介面類

MainActivity類

執行結果:

參考文獻

相關文章