天天看點

Java SE Lesson 9

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的預設通路控制檢查.