新聞中心
反射:

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比華寧網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式華寧網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋華寧地區(qū)。費用合理售后完善,10年實體公司更值得信賴。
可以動態(tài)的獲取指定類中的成員,以及建立類對象。
好處:提高了程序的擴展性。
張三,李四等這些生活中的對象,可以通過Person類的形式對其進行描述。
當class文件產(chǎn)生以后,這些class文件也是生活中的事物,那么對這些class文件也可以進行描述,該描述對應的類型就是Class。
在java中,每一個字節(jié)碼文件都有一一個與之對應的Class對象。不僅包括引用數(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é)碼文件的三種方式。
以前操作對象的時候用的是new關鍵字完成,并通過對象.成員方式進行調(diào)用
- Person p= new Person();
- //1.光加載Person.class文件。
- //2.對對象進行初始化。
- p.function("heihei");
- //在對象調(diào)用成員方法時,需要明確兩個因素:
- 1.對象 2.獲取參數(shù)列表
現(xiàn)在可以通過字節(jié)碼對象完成以上動作。
- //加載Person.class文件,獲取Person.class文件對象的Class對象
- Class clazz = Class.forName("Person");
- //通過字節(jié)碼文件對象,對指定類進行創(chuàng)建并初始化。
- Person p=(Person)clazz.newInstance();
- //通過對象調(diào)用成員
- //p.function("heihei");
類可以作為參數(shù)進行傳遞,那么方法也一樣可以作為參數(shù)進行傳遞,因為方法存在于字節(jié)碼文件內(nèi), 所以可以通過Class對象獲取字節(jié)碼文件中的內(nèi)容。
- Method m = Class.getMethod("function",String.class);
- m.invoke(p,"heihei");
類或者方法都作為參數(shù)傳遞這樣對于開發(fā)到底有那些好處呢?
需求:設計一個主板,為了提高后期的擴展性,也就是為了后期提高電腦的額功能,對外提供了PCI的接口。以方便電腦功能的擴展。
- 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);
- }
- }
后期,要進行電腦功能的擴展,需加入一個網(wǎng)卡,只需要定義一個網(wǎng)卡類實現(xiàn)PCI接口,只要覆蓋這個規(guī)則,主板就可以使用該板卡。
- class NetCard implements PCI{
- public void open();{
- system.out.println("open");
- }
- public void close();{
- system.out.println("close");
- }
- }
那么為了使用其網(wǎng)卡,還需要做一個步驟就是在已定義好的應用程序中,建立網(wǎng)卡對象,并作為參數(shù)傳入,那么就是對原有的程序進行修改。這樣不利于程序的健壯性。
可不可以在不修改源碼的基礎上運行后期出現(xiàn)的這些子類對象呢?
只要在前期設計時,將后期指定的類進行對象的建立,這樣后期的子類對象就不需要再建立對象,只要將子類名稱告知即可。
為了獲取后期對象,并在前期可以使用,或?qū)ν馓峁┝艘粋€配置文件。前期程序可以直接操作該配置文件,后期的子類只需要將子類名稱存入配置文件即可。
這時就需要動態(tài)的獲取指定的類并預先創(chuà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
當后期出現(xiàn)網(wǎng)卡或者聲卡的時候,只需要將該子類的全類名存入配置文件即可, 源程序不需要進行修改
在該例中,可以了解,反射給我們的程序帶來了很強的擴展性。
網(wǎng)頁名稱:Java中反射機制詳解
網(wǎng)站鏈接:http://fisionsoft.com.cn/article/dhpsdcs.html


咨詢
建站咨詢
