1.Java中,無論生成某個類的多少個對象,這些對象都會對應于同一個Class對象.
Java反射機制主要由以下類來實作Java反射機制,這些類都是位于java.lang.reflect包中.
Class類:代表一個類.
Field:代表類的成員變量(成員變量也稱為類的屬性)
Method類:代表類的方法.
Constructor類:代表類的構造方法.
Array:提供了動态建立數組,以及通路數組的元素的靜态方法.
2.Class類:位于java.lang包中.
Class.getMethod方法說明:
getMethod
public Method
getMethod
(String
name,
Class
<?>... parameterTypes)
throws NoSuchMethodException
,
SecurityException
- 傳回一個
對象,它反映此Method
對象所表示的類或接口的指定公共成員方法。Class
參數是一個name
,用于指定所需方法的簡稱。String
參數是按聲明順序辨別該方法形參類型的parameterTypes
對象的一個數組。如果Class
為parameterTypes
,則按空數組處理。null
Method 類的invoke方法:
invoke
public Object
invoke
(Object
obj,
Object
... args)
throws IllegalAccessException
,
IllegalArgumentException
,
InvocationTargetException
- 對帶有指定參數的指定對象調用由此
Method
對象表示的底層方法。個别參數被自動解包,以便與基本形參相比對,基本參數和引用參數都随需服從方法調用轉換。
如果底層方法是靜态的,那麼可以忽略指定的
obj
參數。該參數可以為 null。
如果底層方法所需的形參數為 0,則所提供的
args
數組長度可以為 0 或 null。
如果底層方法是執行個體方法,則使用動态方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基于目标對象的運作時類型的重寫時更應該這樣做。
如果底層方法是靜态的,并且尚未初始化聲明此方法的類,則會将其初始化。
如果方法正常完成,則将該方法傳回的值傳回給調用者;如果該值為基本類型,則首先适當地将其包裝在對象中。但是,如果該值的類型為一組基本類型,則數組元素不 被包裝在對象中;換句話說,将傳回基本類型的數組。如果底層方法傳回類型為 void,則該調用傳回 null。
3.要想使用反射,首先需要獲得待處理類的對應的Class對象.
獲得的三種方法:①Class.forName()方法.
②類名.class:例如:String.class
③使用對象的getClass()方法:String s = “aa”; Class<?> clazz = s.getClass();
4.若想通過類的不帶參數的構造方法來生成對象,我們有兩種方式:
a)先獲得Class對象,然後通過該Class對象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
b)先獲得Class對象,然後通過該對象獲得對應的Constructor對象,再通過Constructor對象的newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
5.若想通過類的帶參數的構造方法生成對象,隻能使用下面這一種方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class,int.class});
Object obj = cons.newInstance(new Object[]{“Hello”,4});
6.Integer.TyPE傳回的是int,而Integer.class傳回的是Integer類所對應的Class對象.
7.Class類的getDeclaredMethod()能夠傳回所有傳回的方法
getMethod()方法隻能傳回public的方法體.
8.setAccessible(boolean flag)方法:如果flag是true那麼表示壓治java的預設通路控制檢查.