您好,登錄后才能下訂單哦!
1.什么是"反射":
它是Java中提供的一種“操作對(duì)象”的方式。在運(yùn)行狀態(tài)下,通過class文件對(duì)象,去使用構(gòu)造方法,成員變量,成員方法。 之前我們創(chuàng)建對(duì)象:
class Demo{
Student stu = new Student();
}
會(huì)使Demo類“依賴于”Student類--產(chǎn)生耦合
反射使用另一種方式操作對(duì)象,就可以解決這種依賴關(guān)系;
方法有三種:
1.類名.class
2.對(duì)象.getclass()
3.class.forName("包名.類名")
好處:
只要有一個(gè)類或者一個(gè)類的對(duì)象,就可以得到這個(gè)類或?qū)ο蟮乃袑傩院头椒?包括私有的
同步方法
反射成員方法:
1.獲取字節(jié)碼文件
Class c = Class.forName("包名.類名");
2.反射方法
Method m = c.getMethod("反射的方法",方法的參數(shù)類型.class);
3.用方法,m.invoke(對(duì)象,參數(shù)) 對(duì)象,c.newInstance ,在A建立對(duì)象。
m.invoke(c.newInstance(),參數(shù));
類加載器與反射有什么關(guān)系
反射是通過字節(jié)碼文件對(duì)象,將類的字段,方法,構(gòu)造器等映射成相應(yīng)的類,并進(jìn)行各自的操作;
類加載器是通過某個(gè)類的.classLoader()方法,將該類的.class文件從硬盤中加載到j(luò)ava虛擬機(jī)中,形成字節(jié)碼文件;
2.什么是“字節(jié)碼對(duì)象“:
每個(gè)類被加載之后,系統(tǒng)就會(huì)為該類生成一個(gè)對(duì)應(yīng)的字節(jié)碼對(duì)象,通過該字節(jié)碼對(duì)象就可以訪問到JVM中的對(duì)應(yīng)的類。
獲取字節(jié)碼對(duì)象的三種方式
1.使用類的.class屬性
Class<類類型> clz1 = 類名.class;
1
2.通過Class類中的靜態(tài)方法forName(String className),傳入類的全限定名(必須添加完整包名)比較常用
Class<?> clz2 = Class.forName("java.util.Date");
1
3.通過對(duì)象的getClass方法來實(shí)現(xiàn),其中,getClass()是Object類中的方法,所有的對(duì)象都可以調(diào)用該方法
Date str = new Date();
Class<?> clz3 = str.getClass();
Class clazz = this.getClass();//獲取字節(jié)碼對(duì)象
Method method = clazz.getMthod("方法名",req.class,resp.class);//反射方法的字節(jié)碼對(duì)象
注意:同一個(gè)類在JVM中只存在一份字節(jié)碼對(duì)象,也就說上述,claz1 == clz2 == clz3;
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。