反射
1.1 基本概念
反射本質上就是一種動態編程的技術,可以在運行階段動態地創建對象以及動態地調用方法,具體由實參決定。
優點:
1)動態的創建對象
2)動態的調用對象
缺點:
1)可讀性差
2)編碼的難度高
目前主流的框架技術底層都是反射的機制,如:structs、spring、hibernate等
普通的創建對象特點:代碼簡單、創建的對象臺固定
如:
Person p = new Person(); - 只能創建Person類型的對象。
Student s = new Student(); - 只能創建Student類型的對象。
void show(){}
void show(int i){}
void show(double d){}
... ...
1.2 Class類
(1)基本概念
java.lang.Class類的實例代表應用程序的類和接口,通俗來說,就是該類的實例代表一種數據類型。
該類沒有公共的構造方法,該類的實例都是由java虛擬機和類加載器自動構造。
(2)Class對象的獲取方式
a.使用數據類型.class的方式可以獲取該類型的Class對象。
b.使用對象.getClass()的方式可以獲取該類型的Class對象。
c.使用包裝類的TYPE屬性獲取該包裝類對應基本數據類型的Class對象。
d.使用Class類的forName()方法獲取參數類型的Class對象。(3)常用的方法
> static Class<?> forName(String className)
> -獲取參數指定類型的Class對象。
>
> T newInstance() - 根據Class對象創建新實例。
> Constructor<T> getConstructor(Class<?>... parameterTypes)
> - 用於獲取當前Class對象對應類中指定的公共構造方法。
>
>Constructor<?>[] getConstructors()- 獲取對應類中所有的公共構造方法。
>
>Field getDeclaredField(String name) - 獲取對應類中指定的成員變量。
>
>Field[] getDeclaredFields() - 獲取對應類中所有的成員變量。
>
>Method getMethod(String name, Class<?>... parameterTypes)
> - 用於獲取對應類中指定的公共成員方法。
>
>Method[] getMethods() - 用於獲取對應類中所有的公共成員方法。
1.3 Constructor類
java.lang.reflect.Constructor類用於描述獲取到的構造方法。 T
newInstance(Object… initargs) - 調用當前描述的構造方法去創建新實例。
1.4 Field類
java.lang.reflect.Field類用於描述獲取到的成員變量。
Object get(Object obj) -用於獲取指定對象中此成員變量的數值。
void setAccessible(boolean flag) -參數爲true表示可以訪問私有成員。
void set(Object obj, Object value) - 用於修改指定對象中當前成員變量的數值。
1.5 Method類
java.lang.reflect.Method類用於描述獲取到的成員方法。
Object invoke(Object obj, Object… args) - 用於obj對象調用當前方法,並傳遞args作爲實參。