「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(調用方法)