黑馬程式設計師 關於反射技術

2021-06-16 23:36:54 字數 4041 閱讀 8524

---------------------- asp.net+android+ios開發、.net培訓、期待與您交流!----------------------

反射類用於製作框架中。有了反射,在配置檔案中寫的**才能被解析。

通過反射有三種方法可以載入類:

1、classclazz=class.forname("cn.itcast.reflect.person");

class類代表某個類的位元組碼,呼叫forname方法,載入某個類,返回某個類的位元組碼;

這句**執行,就是把硬碟上的person類載入到了記憶體中並採用class類進行封裝成為位元組碼

2、class clazz1=new person().getclass();

3、class clazz2=person.class;

由於乙個類有多個組成部分,例如:成員變數,方法,構造方法等。反射就是載入類,並解剖出類的各個組成部分。

一、解剖反射類的建構函式,建立類的物件。

下面是對於person類的各種建構函式進行反射的**:

1、對於公共的無參建構函式public person(),實現**如下:

classclazz=class.forname("cn.itcast.reflect.person");//獲取類的位元組碼物件

constructorc=clazz.getconstructor(null);//獲取建構函式物件,引數型別為null

person p=(person)c.newinstance(null);//初始化物件,傳入的引數是null

2、對於公共的有參建構函式public person(string name),實現**如下:

classclazz=class.forname("cn.itcast.reflect.person");

constructorc=clazz.getconstructor(string.class);//引數型別為string.class

person p=(person)c.newinstance("abc");//初始化物件,傳入引數是string型別即可

3、對於公共的多參建構函式public person(string name,intpassword),實現**如下:

classclazz=class.forname("cn.itcast.reflect.person");

//引數型別為string.class,int.class

constructorc=clazz.getconstructor(string.class,int.class);

//初始化物件,傳入引數對應建構函式即可

personp=(person) c.newinstance("abc",999);

4、對於私有建構函式private person(list list),實現**如下:

class clazz=class.forname("cn.itcast.reflect.person");

//使用的是getdeclaredconstructor()方法。

constructorc=clazz.getdeclaredconstructor(list.class);

c.setaccessible(true);//暴力反射,強制開啟訪問許可權

personp=(person) c.newinstance(new arraylist());

5、建立物件的另外一種途徑,無參構造方法,等效於1

classclazz=class.forname("cn.itcast.reflect.person");

personp=(person) clazz.newinstance();

二、解剖反射類的方法

下面是對於person類的各種方法進行反射的**:

1、對於公共無參並且無返回值的方法publicvoid test(),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

//第乙個引數是方法名,第二個是傳入的引數型別,將test方法傳入method物件中

method method =clazz.getmethod("test", null);

person p = newperson();//建立person物件

method.invoke(p,null);//執行方法,第乙個引數要指定是哪個物件執行的方法

2、對於公共有參並且無返回值的方法publicvoid test (string name,int password),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

//同樣,第乙個引數是方法名,後面的引數按照方法定義的順序寫

method method =clazz.getmethod("test ", string.class,int.class);

person p = newperson();

method.invoke(p,"abc",1111);//執行方法

3、對於公共有參返回型別為陣列的方法publicclass test(string name,int password),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

method method = clazz.getmethod("test ",string.class,int.class);

person p = new person();

//將返回資料傳給cs class類陣列中

class cs = (class) method.invoke(p, "abc",newint);

4、對於私有方法private voidtest(inputstream in),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

//私有方法使用的是getdeclaredmethod方法。

method method =clazz.getdeclaredmethod("test ",inputstream.class);

method.setaccessible(true);//暴力反射,強制開啟訪問許可權

person p = newperson();

method.invoke(p,newfileinputstream("c:\\1.txt"));

5、對於靜態方法public static voidtest(int num),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

method method =clazz.getmethod("test",int.class);

method.invoke(null,777);//靜態方法呼叫不需要物件,不過給物件也可以

6、對於如main方法一樣的傳入引數是字串陣列的方法public static void main(stringargs),實現**如下:

class clazz =class.forname("cn.itcast.reflect.person");

method method =clazz.getmethod("main",string .class);

string str =;

method.invoke(null,(object)str);//將string陣列轉化為object類,就可以執行

三、解剖反射類的字段

1、對於公共欄位public stringname來說,實現**如下:

public void test1() throw***ception

2、對於私有欄位private int password來說,實現**如下:

publicvoid test2() throws exception

---------------------- asp.net+android+ios開發、.net培訓、期待與您交流!----------------------

詳細請檢視:

黑馬程式設計師 反射技術

動態載入乙個類,得到這個類中的所有內容。而且將位元組碼檔案封裝在乙個物件中 class物件 並將位元組碼中的內容都封裝成對像,這樣便於操作這些成員。可以說反射技術大大地增強了程式的擴張性,因為乙個類進行解刨後,可以對他進行很多操作。得到類的位元組碼,將這個類的位元組碼封裝在class物件中 例項化物...

黑馬程式設計師 反射

反射技術 實就是動態載入乙個指定的類,並獲取該類中的所有的內容。而且將位元組碼檔案封裝成物件,並將位元組碼檔案中的內容都封裝成物件,這樣便於操作這些成員。簡單說 反射技術可以對乙個類進行解剖。反射的好處 大大的加強了程式的擴充套件性。反射的基本步驟 1.獲得class物件,就是獲得指定的檔案的位元組...

黑馬程式設計師 反射

反射 理解 1 反射 在程式執行時期,是通過 class 檔案物件,去使用構造方法,成員變數,成員方法。2 獲取 class 檔案物件 1 object類的 getclass 方法2 資料型別的靜態的 class 屬性3 class類 forname 靜態方法 推薦 開發使用第三種。class類中的...