在思否上面開了一個專欄,主要是想對零散的知識點作一個梳理,在與你們交流的同時,也增強本身的理解。
今天主要談一下Java中的反射機制,雖然實際編程中咱們不多直接使用,可是反射機制卻始終圍繞着咱們java程序員。咱們知道由Java語言編寫的程序須要通過編譯和解釋兩個步驟,通過編譯生成一種與平臺無關的字節碼文件,即*.class文件。將 *.class文件讀入內存,並建立一個java.lang.Class對象的過程稱爲類的加載,在這兒咱們先不談類的加載機制,今天的重點是反射,之因此有上面的介紹,是由於反射就是經過該Class對象訪問整個類的一個過程。java
- 獲取Class對象的三種方式:
使用Class類的forName(String clazzName)靜態方法
調用某個類的class屬性獲取該類的Class對象,eg:Student.class
調用某個對象的getClass()方法, eg:student.getClass()
- 獲取Class對應類所包含的構造方法
Constructor<T> getConstructor():返回對應類無參的public構造方法
Constructor<T> getConstructor(Class<?> ...parameterTypes):返回對應類帶指定形參列表的public構造方法
Constructor<?>[] getConstructors():返回對應類全部public構造方法
Constructor<?>[] getDeclaredConstructors():返回對應類的全部構造方法
- 獲取Class對應類所包含的普通方法
Method getMethod(String name,Class<?> ... parameterTypes):返回對應類的帶指定形參列表的public方法
Method[] getMethods():返回對應類的全部public方法
Method getDeclaredMethod(String name,Class<?> ... parameterTypes):返回對應類的帶指定形參列表的方法
Method[] getDeclaredMethods():返回對應類的所有方法
- 獲取Class對應類所包含的成員變量
Field getField(String name):返回對應類指定指定名稱的public成員變量
Filed[] getFields():返回對應類的全部public成員變量
Filed getDeclaredField(String name):返回對應類的指定名稱的成員變量
Filed[] getDeclaredFields():返回對應類的所有成員變量
上面利用Class對象獲取對應類的構造方法、普通方法、成員變量都比較簡單,之因此放在這兒,是方便查看,因此不給出示例代碼。
接下來,着重介紹兩個利用反射的典型例子:程序員
Spring利用反射實現控制反轉(IOC)的具體實現
這兒有具體的實現過程,有興趣能夠本身寫一遍,有助於更好的理解編程
利用反射實現泛型的擦除
public class GenericErasure {
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("你好");
Class<? extends List> clazz = list.getClass();
Method method = clazz.getMethod("add",Object.class);
method.invoke(list, 1);
for (Object ele : list) {
System.out.println(ele);
}
}
}
定義一個泛型爲String的list集合,使用反射技術,能夠實現泛型的擦除,加入int類型的值。segmentfault