1. 程式人生 > >Java筆記:反射

Java筆記:反射

框架:即半成品的軟體,可以在其基礎上進行軟體開發,以簡化程式碼
反射:將類的各個組成部分封裝為其他物件,也即是反射機制
好處:

  1. 可以在程式執行過程中操作這些物件
  2. 可以解耦,提高程式的可擴充套件性

獲取class物件的方式:

1.Class.forName(“全類名”):將位元組碼檔案載入進記憶體,並返回Class物件

多用於配置檔案,將類名定義在配置檔案中。讀取檔案,載入類

2.類名.class:通過類名的屬性class獲取

多用於引數的傳遞

3.物件.getClass():使用Object類定義的方法

多用於物件獲取位元組碼的方式

同一個位元組碼檔案(*.class)在一次程式執行過程中,只會被載入一次,無論使用何中方式獲取class物件,都是同一個

如何獲取內部類的反射?
Class.forName(“外部類名$內部類名”);

Class物件的功能

獲取功能
獲取成員變數們

        * Field[] getFields() :獲取所有public修飾的成員變數
        * Field getField(String name)   獲取指定名稱的 public修飾的成員變數
        * Field[] getDeclaredFields()
獲取所有的成員變數,不考慮修飾符 * Field getDeclaredField(String name)
    2. 獲取構造方法們
      * Constructor<?>[] getConstructors()  
      * Constructor<T> getConstructor(Class<?>... parameterTypes)  

      * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  
      * Constructor<?>[] getDeclaredConstructors()  
    3. 獲取成員方法們:
        * Method[] getMethods()  
        * Method getMethod(String name, Class<?>... parameterTypes)  

        * Method[] getDeclaredMethods()  
        * Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
    4. 獲取全類名    
      * String getName()  

Field:成員變數
1.設定值

void set(Object,Object value)

obj為該類的具體物件

2.獲取值

Object get(Object obj)

3.忽略訪問修飾符的安全檢查

void setAccessible(true)

也叫暴力反射
Constructure:構造方法
建立物件:

T newInstance(Object...initargs)

如果使用空引數構造方法建立物件,操作可以簡化:Class物件的newInstance方法

Method:成員方法物件
執行方法:

Object invoke(Object obj,Object...args)

獲取方法名稱:

String getName()