---------------------- 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類中的...