1. 反射的概述:
解釋:
是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意屬性和方法;
這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。
通俗的理解:
- 利用反射創建的對象可以無視修飾符調用類裏面的內容
- 可以跟配置文件結合起來使用,把要創建的對象信息和方法寫在配置文件中。
讀取到什麼類,就創建什麼類的對象
讀取到什麼方法,就調用什麼方法
此時當需求變更的時候不需要修改代碼,只要修改配置文件即可。
2. 學習反射到底學什麼?
反射都是從class字節碼文件中獲取的內容。
- 如何獲取class字節碼文件的對象
- 利用反射如何獲取構造方法(創建對象)
- 利用反射如何獲取成員變量(賦值,獲取值)
- 利用反射如何獲取成員方法(運行)
3.獲取字節碼文件對象的三種方式
- Class這個類裏面的靜態方法forName(“全類名”)
- 通過class屬性獲取
- 通過對象獲取字節碼文件對象
4. 字節碼文件和字節碼文件對象
java文件:就是我們自己編寫的java代碼。
字節碼文件:就是通過java文件編譯之後的class文件
字節碼文件對象:當class文件加載到內存之後,虛擬機自動創建出來的對象。
這個對象裏面至少包含了:構造方法,成員變量,成員方法。
而我們的反射獲取的是什麼?字節碼文件對象,這個對象在內存中是唯一的。
5. 獲取構造方法
規則:
get表示獲取
Declared表示私有
最後的s表示所有,複數形式
如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用
|
方法名 |
説明 |
|
Constructor<?>[] getConstructors() |
獲得所有的構造(只能public修飾) |
|
Constructor<?>[] getDeclaredConstructors() |
獲得所有的構造(包含private修飾) |
|
Constructor getConstructor(Class<?>... parameterTypes) |
獲取指定構造(只能public修飾) |
|
Constructor getDeclaredConstructor(Class<?>... parameterTypes) |
獲取指定構造(包含private修飾) |
6.獲取構造方法並創建對象
涉及到的方法:newInstance
7. 獲取成員變量
規則:
get表示獲取
Declared表示私有
最後的s表示所有,複數形式
如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用
方法名:
|
方法名 |
説明 |
|
Field[] getFields() |
返回所有成員變量對象的數組(只能拿public的) |
|
Field[] getDeclaredFields() |
返回所有成員變量對象的數組,存在就能拿到 |
|
Field getField(String name) |
返回單個成員變量對象(只能拿public的) |
|
Field getDeclaredField(String name) |
返回單個成員變量對象,存在就能拿到 |
8. 獲取成員變量並獲取值和修改值
|
方法 |
説明 |
|
void set(Object obj, Object value) |
賦值 |
|
Object get(Object obj) |
獲取值 |
9. 獲取成員方法
規則:
get表示獲取
Declared表示私有
最後的s表示所有,複數形式
如果當前獲取到的是私有的,必須要臨時修改訪問權限,否則無法使用
|
方法名 |
説明 |
|
Method[] getMethods() |
返回所有成員方法對象的數組(只能拿public的) |
|
Method[] getDeclaredMethods() |
返回所有成員方法對象的數組,存在就能拿到 |
|
Method getMethod(String name, Class<?>... parameterTypes) |
返回單個成員方法對象(只能拿public的) |
|
Method getDeclaredMethod(String name, Class<?>... parameterTypes) |
返回單個成員方法對象,存在就能拿到 |
10. 獲取成員方法並運行
方法
Object invoke(Object obj, Object... args) :運行方法
參數一:用obj對象調用該方法
參數二:調用方法的傳遞的參數(如果沒有就不寫)
返回值:方法的返回值(如果沒有就不寫)