「Java開發」反射機制

1.如何引用一個類中不知道的方法?

反射機制

2.何謂反射機制

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

3.Java 反射機制提供的功能

【1】在運行時判斷任意一個對象所屬的類。

【2】在運行時構造任意一個類的對象。

【3】在運行時判斷任意一個類所具有的成員變數和方法。

【4】在運行時調用任意一個對象的方法。

4反射機制介紹.

Reflection 是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的所有信息,並可於運行時改變fields內容或調用methods。

Advertisements

在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中:

Class類:代表一個類。

Field 類:代表類的成員變數(成員變數也稱為類的屬性)。

Method類:代表類的方法。

Constructor 類:代表類的構造方法。

Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。

5.如何獲得Class對象

【1】在未知類時,通過完整的類名獲得class對象(常用)

例如: Class c = Class.forName(「java.lang.xxx」);

【2】通過類名.class獲得

例如:Class c = String.class

【3】通過對象獲得

例如:String s = new String(「abc」);

Advertisements

注意:

1.getName()

一個Class對象描述了一個特定類的特定屬性,而這個方法就是返回String形式的該類的簡要描述。由於歷史原因,對數組的Class對象

調用該方法會產生奇怪的結果。

2.newInstance()

該方法可以根據某個Class對象產生其對應類的實例。需要強調的是,它調用的是此類的默認構造方法。例如:

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

3.getClassLoader()

返回該Class對象對應的類的類載入器。

4.getComponentType()

該方法針對數組對象的Class對象,可以得到該數組的組成元素所對應對象的Class對象。例如:

int[] ints = new int[]{1,2,3};

Class class1 = ints.getClass();

Class class2 = class1.getComponentType();

而這裡得到的class2對象所對應的就應該是int這個基本類型的Class對象。

5.getSuperClass()

返回某子類所對應的直接父類所對應的Class對象。

6.isArray()

判定此Class對象所對應的是否是一個數組對象。

6.constructor類

Constructor類對象獲取方式

【1】獲取所有的構造器

Constructor [] construcorss = cls.getconstuctors();

【2】獲取指定的構造器

Constructor constructor1 = cls.getConsturctor(String.class);

Constructor constructor2= cls.getConsturctor();

反射機制的體現:

Class--constructor c(構造器對象)--newInstance(創建對象)

7.Field類

【1】獲取所有public成員變數

Field[] fis = p.getFields();

【2】獲得所有的所有成員變數(包括private)

Field[] fs2 = cls.getDeclaredfields();

【3】獲得指定的成員變數

Field f = cls.getDeclaredFields(「name」);

此時還不能訪問,先調用f.setAcessible(true)使其可以訪問,然後通過f.get(person)獲得person對象中name域的「狀態」值。

反射機制的體現:

Class cls---- Field(域對象)-----訪問或設置域

8.Method類

【1】獲取所有的public方法

Method[] msl = cls.getMethods();

【2】獲得所有的本類的方法(包括private)

Method[] ms2 = cls.getDeclaredMethods();

【3】獲得指定的成員方法

Method m1 = cls.getDeclaredMethod(「say」,String.class);

【4】通過反射執行方法

1.成員方法 invoke(Object,Objetc args)

2.靜態方法 invoke(null,Object args)

反射機制的體現:

Class cls----Method(方法對象)------invoke(調用方法)

Advertisements

你可能會喜歡