将之前學的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執行個體化對象,但程式中不建議使用。