反射基礎

反射概念

簡單的理解成動態的加載一個類,將字節碼文件和字節碼文件的成員封裝成對象,來提供對其內容的操作。簡單來說,反射技術就是對一個類的解剖。

反射的好處:大大的增強了程序的擴展性。
弊端:打破了封裝性

反射基本步驟

1.獲得Class對象,就是獲取到指定的名稱的字節碼文件對象。
2.實例化對象,獲得類的屬性、方法或構造函數。
3.訪問屬性、調用方法、調用構造函數創建對象。

獲取Class字節碼對象(三種)

1.通過對象的getClass()方法獲取(要建立對象,才能調用,常用於獲得對象類型

Object o = new Person();
Class clazz = o.getClass();

2.通過數據類型的靜態屬性(.class)獲取(要明確類型才能調用,常用於傳參

Class clazz = Person.class;

3.使用Class類中的靜態方法 forName()(擴展性最強,只需要獲得類名的字符串,常用於類加載

//通常可以重配置文件中獲取
String className = "net.hncu.domain.Person";
Class clazz = Class.forName(className);

反射用法

反射類的成員方法(Method){指定方法&所有方法||公有&私有}:

//步驟一:獲取class對象
Class<XmlDom> clazz = XmlDom.class;
//步驟二:獲取Method

//1.獲取指定 公有 的方法,注意參數是參數所屬類型的.class文件。
Method method = clazz.getMethod("write", String.class,int.class);

//2.獲取指定方法,可以是私有方法。
Method method1 = clazz.getDeclaredMethod("write", String.class,int.class);

//3.獲取所有公有方法。
Method[] methods = clazz.getMethods();

//4.獲取所有方法,包括私有方法。
Method[] methods1 = clazz.getDeclaredMethods();

//步驟三:實例化一個空參對象
Object object=clazz.newInstance();
//步驟四:設置暴力訪問私有方法
method1.setAccessible(true);
//步驟五:執行一個方法
method1.invoke(object,"反射",10);

反射類的構造函數(Constructor):

Class clazz = XmlDom.class;
//1.獲取一個公有 有參構造函數
Constructor<XmlDom> c = clazz.getConstructor(String.class,int.class);
//2.反射私有有參構造函數
Constructor<XmlDom> c = clazz.getDeclaredConstructor(String.class,int.class);
//3. 反射所有公有構造犯法
Constructor[] constructors = clazz.getConstructors();
//4. 反射所有構造反法,包括私有的
constructors = clazz.getDeclaredConstructors();
//#通過反射的有參構造函數進行實例化(調用的是構造器的newInstance()方法)
c.newInstance("反射",10);

反射類的屬性(Field):

//通過字段名獲得該字段
Field field = clazz.getField(fieldName);
field.setAccessible(true);
//給該字段賦值
field.setObject(value);

通過反射創建對象的方法(.getInstance):

1.通過Class類構造無參實例,一般被反射調用的類必須要有公有無參構造器(這也是爲什麼一般實現有參構造後還要寫一個無參構造的原因):

//該方法構造的是無參的實例
Object object = Class.getInstance();

2.通過反射有參構造函數構造有參實例:

Class clazz = XmlDom.class;
//獲取一個公有 有參構造函數
Constructor<XmlDom> c = clazz.getConstructor(String.class,int.class);
//通過反射的有參構造函數進行實例化(調用的是構造器的newInstance()方法)
c.newInstance("反射",10);

提取註解(Annotation)

獲取 Annotation實例(詳細):

getAnnotation(Class<T> annotationClass)
getDeclaredAnnotations()
getParameterAnnotations()

實用案例

1.獲取該類或父類中的指定的方法(可能父類獨有方法)

//傳入字子類class對象,方法名,參數列表
public Method getMethod(Class clazz, String methodName, Class ... args) { 
    //若該類存在則返回並中斷,如沒有且不是Object類,獲得其父類class   
     for (; clazz != Object.class; clazz = clazz.getSuperclass()){  
         try {  
             return clazz.getDeclaredMethod(methodName, args);  
         } catch (Exception e) {  
         }  
     }  
     return null;  
 }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章