反射機制+註解

反射是一種機制,利用該機制可以在程序運行過程中對類進行解剖並操作類中的方法,屬性,構造方法等成員。

前提:使用反射機制的前提條件是獲取字節碼文件對象,即Class類型對象.

獲取Class對象的三種方式:

1:通過 類名.class 獲取

eg:Class c = Student.class;

2:通過Object類的getClass()方法獲取

eg:Student stu = new Student(); Class c = stu.getClass();

3:通過Class.forName(“權限定類型”)獲取

eg: String className = "com.yxx.bean.Student"; Class clazz = Class.forName(className);

Class對象相關方法 :

String getSimpleName(); 獲得簡單類名,只是類名,沒有包
String getName(); 獲取完整類名,包含包名+類名
T newInstance() ;

創建此 Class 對象所表示的類的一個新實例。

要求:類必須有public的無參數構造方法

反射獲取Class對象的Constructor方法:

Constructor getConstructor(Class... parameterTypes)

根據參數類型獲取構造方法對象,只能獲得public修飾的構造方法。

如果不存在對應的構造方法,則會拋出 java.lang.NoSuchMethodException 異常。

Constructor getDeclaredConstructor(Class... parameterTypes)

根據參數類型獲取構造方法對象,包括private修飾的構造方法。

如果不存在對應的構造方法,則會拋出 java.lang.NoSuchMethodException 異常。

Constructor[] getConstructors() 獲取所有的public修飾的構造方法
Constructor[] getDeclaredConstructors() 獲取所有構造方法,包括privat修飾的
T newInstance(Object... initargs) 根據指定參數創建對象。
void setAccessible(true) 暴力反射,設置爲可以直接訪問私有類型的構造方法。

反射獲取Class對象的Method方法:

Method getMethod("方法名", 方法的參數類型... 類型) 根據方法名和參數類型獲得一個方法對象,只能是獲取public修飾的
Method getDeclaredMethod("方法名", 方法的參數類型... 類型) 根據方法名和參數類型獲得一個方法對象,包括private修飾的
Method[] getMethods() 獲取所有的public修飾的成員方法,包括父類中。
Method[] getDeclaredMethods() 獲取當前類中所有的方法,包含私有的,不包括父類中。
Object invoke(Object obj, Object... args)

根據參數args調用對象obj的該成員方法

如果obj=null,則表示該方法是靜態方法

void setAccessible(boolean flag) 暴力反射,設置爲可以直接調用私有修飾的成員方法

反射獲取Class對象的Field方法:

Field getDeclaredField(String name) 根據屬性名獲得所有屬性對象,包括private修飾的
Field getField(String name) 根據屬性名獲得屬性對象,只能獲取public修飾的
Field[] getFields() 獲取所有的public修飾的屬性對象,返回數組。
Field[] getDeclaredFields() 獲取所有的屬性對象,包括private修飾的,返回數組。

註解

  1. 屬性的作用 可以讓用戶在使用註解時傳遞參數,讓註解的功能更加強大。

  2. 屬性的格式

         格式1:數據類型 屬性名();

         格式2:數據類型 屬性名() default  默認值;

     3.屬性適用的數據類型

              八種基本數據類型(int,float,boolean,byte,double,char,long,short)

              String類型,Class類型,枚舉類型,註解類型

               以上所有類型的一維數組

元註解

@Target  
作用: 指明此註解用在哪個位置,如果不寫默認是任何地方都可以使用。
可選的參數值在枚舉類ElemenetType中包括:

TYPE: 用在類,接口上

FIELD:用在成員變量上

METHOD: 用在方法上

PARAMETER:用在參數上

CONSTRUCTOR:用在構造方法上

LOCAL_VARIABLE:用在局部變量上

@Retention  
作用: 定義該註解的生命週期(有效範圍)。
可選的參數值在枚舉類型RetentionPolicy中包括

SOURCE:註解只存在於Java源代碼中,編譯生成的字節碼文件中就不存在了

CLASS:註解存在於Java源代碼、編譯以後的字節碼文件中,運行的時候內存中沒有,默認值。 RUNTIME:註解存在於Java源代碼中、編譯以後的字節碼文件中、運行時內存中,程序可以通過反射獲取該 註解。

註解的接口

1.Anontation:所有註解類型的公共接口,類似所有類的父類是Object。

2.AnnotatedElement:定義了與註解解析相關的方法,常用方法以下幾個

boolean isAnnotationPresent(Class annotationClass); 判斷當前對象是否有指定的註解,有則返回true,否則返回false。
T getAnnotation(Class<T> annotationClass); 獲得當前對象上指定的註解對象。
Annotation[] getAnnotations(); 獲得當前對象及其從父類上繼承的所有的註解對象。

我們使用反射的時候 , 都需要先獲取類的字節碼對象 ,最常用的方式就是 Class.forName("類的全限定名") .我們可以通過字節碼對象就可以獲取類的構造器 , 從而創建對象 ,最常用的方式是通過字節碼對象獲取無參構造器getConstructor , 就可以調用構造器對象的 newInstance() 方法創建對象 , 當然這種方式簡化爲:字節碼對象直接調用 newInstance() 方法創建對象 .也可以通過字節碼對象獲取指定的方法 , 然後調用方法對象的 invoke(Object obj, Object... args) 來執行此方法.也可以通過字節碼對象獲取類中的所有字段 , 從而給字段賦值和獲取字段的值 .有了以上的基礎 , 我們就可以通過一個指定全限定名 , 就可以創建該類對象的實例對象 , 執行裏面的方法 , 給其字段進行賦值或者獲取值.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章