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對象調用該方法

參數二:調用方法的傳遞的參數(如果沒有就不寫)

返回值:方法的返回值(如果沒有就不寫)