認識反射機制:反射是指對象的反向處理操作。
在正向操作情況下java中必須要導入一個包才能產生類的實例化對象:根據包名.(點)類名找到類
反向處理的話是根據對象來取得對象的來源信息。
方法:public final native Class<?>getClass();
實例:
結果:
此時通過了對象獲得了對象的來源,真的就是反射的本質
在反射中看中的不是對象,而是對象身後的組成(類,構造,普通,成員等)
1.Class類對象的三種實例化模式
Class類是描述整個類的概念,也就是整個反射的操作源頭,在使用Class類的時候需要關注的依然是這個類的對象。
這個類的對象的生產模式一個有三種:
a.任何類的實例化對象都可以通過Object類的getClass()方法取得Class類對象
b.“類 . class ”:直接提供根據某個具體的類來取得Class類的實例化對象
c.使用Class類提供的方法:public static Class<?> forName(String className) throws Exception
Class類中提供如下方法:
根據反射創建實例化對象:
public T newInstance():通過這個方法來創建實例化對象,通過Class類實例化對象
反射與類操作:
a.取得父類信息 取得類的包名稱:public Package getPackage();
取得父類的Class對象 public Class<? super T>getSuperclass();
取得父類接口public Class<?>[]getInterfaces();
b.反射調用構造方法:
Class提供的newInstance()默認調用類中的無參構造
Class提供的Constructor(參數列表) (只能取得修飾符爲public的構造方法)
取得類中所有構造方法getConstructors(),public修飾 (只能取得修飾符爲public的構造方法)
getDeclaredConstructors()取得所有構造方法,與修飾符無關
getDeclaredConstructor()取得所有構造方法,與修飾符無關
c.反射調用普通方法:
取得所有普通方法:public Method[]getMethods(); 返回本類及其父類的所有public普通方法
getDeclareMethods() 所有修飾符,返回本類所有的普通方法,與修飾符無關
取得指定方法: public Method(方法名,方法參數)
public Method getDeclareMethod(方法名,方法參數)
取得方法後調用:Method提供的 public Object invoke(類的實例化對象,具體參數)
d.反射調用類中屬性:
取得所有類中屬性: getFields
Field getDeclareFields
取得類中指定屬性:Field getFields(屬性名)
Field getDeclaredField(屬性名)
屬性的調用: 設置屬性內容: public void set(具體類的實例化對象,屬性值)
取得屬性內容:public Object get(具體類的實例化對象)
動態設置封裝
AccessibleObject:描述類中結構的可訪問性
動態設置封裝性(1次JVM進程中):
PUBLIC VOID setAccessibleObject(boolean flag):
反射的具體應用:多級VO設置實現