天天看點

馬士兵 java反射_Java反射(一)

将之前學的Java反射進行一個彙總記錄。

1. Class對象執行個體化

Java反射機制就是通過Class對象建立對應執行個體,并調用相關方法。首先是需要有Class對象,有三種擷取Class對象的方式:

(1)Object.getClass(),如Person p = new Person;對應的Class對象為p.getClass().

(2)類.class,如Person.class

(3)Class.forName(),如Class.forName("com.xxx.Person");

2.反射執行個體化對象

拿到類的Class對象,可通過反射進行執行個體化。有兩種方式:

(1)clazz.newInstance()  在1.9版本被标注@Deprecated(since="9")

(2)clazz.getDeclaredConstructor().newInstance()  該方法可以抛出InvocationTargetException 和 NoSuchMethodException兩個異常

3.反射與工廠設計模式

利用Class.forName()方法和clazz.getDeclaredConstructor().newInstance()可以實作類執行個體化的工廠設計模式,如下:

classFactory{privateFactory(){}public static T getInstance(String className, Classclazz){

T instance= null;try{

instance=(T) Class.forName(className).getDeclaredConstructor().newInstance();

}catch(Exception e){

}returninstance;

}

}

4.反射與類操作

(1)擷取包資訊:public Package getPackage()  其中Package implements AnnotatedElement,AnnotatedElement标注可以傳回對應注解

(2)擷取繼承的父類:public Class super T> getSuperclass()

(3)擷取實作的接口:public Class>[] getInterfaces()

(4)擷取構造方法:

擷取全部構造方法:public Constructor>[] getDeclaredConstructors()

擷取指定構造方法:public Constructor getDeclaredConstructor​(Class>... parameterTypes),其中參數為參數類型,如String.class等

(5)擷取方法:

擷取全部方法(包含父類):public Method[] getMethods()

擷取指定方法(保安父類):public Method getMethod​(String name,Class>... parameterTypes),其中name為方法名,後邊為方法參數類型

擷取本類全部方法:public Method[] getDeclaredMethods()

擷取本類指定方法:public Method getDeclaredMethod​(String name,Class>... parameterTypes),其中name為方法名,後邊為方法參數類型

Method中重要的方法為:public Object invoke​(Object obj, Object... args),其中第一個參數為對象執行個體,第二個參數為method的參數。反射方法調用主要通過該方法進行。

(6)擷取屬性

擷取全部屬性(包含父類和接口的所有public屬性):public Field[] getFields()

擷取指定屬性(包含父類和接口的所有public屬性):public Field getField​(String name)

擷取本類全部屬性(不包含繼承的屬性):public Field[] getDeclaredFields()

擷取本類指定屬性:public Field getDeclaredField​(String name)

Field中重要的方法:public Class> getType(),傳回屬性類型。

(7)底層有個Unsafe工具類,可以通過該類繞過JVM執行個體化對象,但程式中不建議使用。