您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java中反射機(jī)制有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java中反射機(jī)制有什么用”這篇文章吧。
反射:
可以動(dòng)態(tài)的獲取指定類中的成員,以及建立類對(duì)象。
好處:提高了程序的擴(kuò)展性。
張三,李四等這些生活中的對(duì)象,可以通過Person類的形式對(duì)其進(jìn)行描述。
當(dāng)class文件產(chǎn)生以后,這些class文件也是生活中的事物,那么對(duì)這些class文件也可以進(jìn)行描述,該描述對(duì)應(yīng)的類型就是Class。
在java中,每一個(gè)字節(jié)碼文件都有一一個(gè)與之對(duì)應(yīng)的Class對(duì)象。不僅包括引用數(shù)據(jù)類型,也包括基本數(shù)據(jù)類型。int.Class
String.class----Class Class class1=String.class; String s="abc"; Class class2=s.getClass(); Class class3 = Class.forName("java.lang.String");
以上就是獲取字節(jié)碼文件的三種方式。
以前操作對(duì)象的時(shí)候用的是new關(guān)鍵字完成,并通過對(duì)象.成員方式進(jìn)行調(diào)用
Person p= new Person(); //1.光加載Person.class文件。 //2.對(duì)對(duì)象進(jìn)行初始化。 p.function("heihei"); //在對(duì)象調(diào)用成員方法時(shí),需要明確兩個(gè)因素: 1.對(duì)象 2.獲取參數(shù)列表
現(xiàn)在可以通過字節(jié)碼對(duì)象完成以上動(dòng)作。
//加載Person.class文件,獲取Person.class文件對(duì)象的Class對(duì)象 Class clazz = Class.forName("Person"); //通過字節(jié)碼文件對(duì)象,對(duì)指定類進(jìn)行創(chuàng)建并初始化。 Person p=(Person)clazz.newInstance(); //通過對(duì)象調(diào)用成員 //p.function("heihei");
類可以作為參數(shù)進(jìn)行傳遞,那么方法也一樣可以作為參數(shù)進(jìn)行傳遞,因?yàn)榉椒ù嬖谟谧止?jié)碼文件內(nèi), 所以可以通過Class對(duì)象獲取字節(jié)碼文件中的內(nèi)容。
Method m = Class.getMethod("function",String.class); m.invoke(p,"heihei");
類或者方法都作為參數(shù)傳遞這樣對(duì)于開發(fā)到底有那些好處呢?
需求:設(shè)計(jì)一個(gè)主板,為了提高后期的擴(kuò)展性,也就是為了后期提高電腦的額功能,對(duì)外提供了PCI的接口。以方便電腦功能的擴(kuò)展。
interface PCI{ void open(); void close(); } class MainBoard{ public void usePCI(PCI p){ p.open(); p.close(); } } class MainBoardDemo{ public static void main(String[] args){ MainBoard mb=new MainBoard(); //mb.usePCI(null); mb.usePCI(NetCard); } }
后期,要進(jìn)行電腦功能的擴(kuò)展,需加入一個(gè)網(wǎng)卡,只需要定義一個(gè)網(wǎng)卡類實(shí)現(xiàn)PCI接口,只要覆蓋這個(gè)規(guī)則,主板就可以使用該板卡。
class NetCard implements PCI{ public void open();{ system.out.println("open"); } public void close();{ system.out.println("close"); } }
那么為了使用其網(wǎng)卡,還需要做一個(gè)步驟就是在已定義好的應(yīng)用程序中,建立網(wǎng)卡對(duì)象,并作為參數(shù)傳入,那么就是對(duì)原有的程序進(jìn)行修改。這樣不利于程序的健壯性。
可不可以在不修改源碼的基礎(chǔ)上運(yùn)行后期出現(xiàn)的這些子類對(duì)象呢?
只要在前期設(shè)計(jì)時(shí),將后期指定的類進(jìn)行對(duì)象的建立,這樣后期的子類對(duì)象就不需要再建立對(duì)象,只要將子類名稱告知即可。
為了獲取后期對(duì)象,并在前期可以使用,或?qū)ν馓峁┝艘粋€(gè)配置文件。前期程序可以直接操作該配置文件,后期的子類只需要將子類名稱存入配置文件即可。
這時(shí)就需要?jiǎng)討B(tài)的獲取指定的類并預(yù)先創(chuàng)建對(duì)象
就用到了反射機(jī)制。重新修改一下應(yīng)用程序。 class MainBoardDemo{ public static void main(String[] args){ MainBoard mb=new MainBoard(); File file=new File("conf.txt"); BufferenReader buff = new BufferenReader(new FileReader(file)); String className = buff.readLine(); Class clazz = Class.forName(className); PCI p = (PCI)clazz.newInstance(); mb.usePCI(p); } }
配置文件conf.txt
當(dāng)后期出現(xiàn)網(wǎng)卡或者聲卡的時(shí)候,只需要將該子類的全類名存入配置文件即可, 源程序不需要進(jìn)行修改
在該例中,可以了解,反射給我們的程序帶來了很強(qiáng)的擴(kuò)展性。
以上是“Java中反射機(jī)制有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(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)容。