日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java中反射機(jī)制詳解

反射:

成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比華寧網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式華寧網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋華寧地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴(lài)。

  可以動(dòng)態(tài)的獲取指定類(lèi)中的成員,以及建立類(lèi)對(duì)象。

好處:提高了程序的擴(kuò)展性。

張三,李四等這些生活中的對(duì)象,可以通過(guò)Person類(lèi)的形式對(duì)其進(jìn)行描述。

當(dāng)class文件產(chǎn)生以后,這些class文件也是生活中的事物,那么對(duì)這些class文件也可以進(jìn)行描述,該描述對(duì)應(yīng)的類(lèi)型就是Class。

在java中,每一個(gè)字節(jié)碼文件都有一一個(gè)與之對(duì)應(yīng)的Class對(duì)象。不僅包括引用數(shù)據(jù)類(lèi)型,也包括基本數(shù)據(jù)類(lèi)型。int.Class

 
 
 
  1. String.class----Class  
  2.  
  3.      Class class1=String.class;  
  4.  
  5.      String s="abc";  
  6.      Class class2=s.getClass();  
  7.  
  8.      Class class3 = Class.forName("java.lang.String");  

以上就是獲取字節(jié)碼文件的三種方式。

     以前操作對(duì)象的時(shí)候用的是new關(guān)鍵字完成,并通過(guò)對(duì)象.成員方式進(jìn)行調(diào)用

 
 
 
  1. Person p= new Person();  
  2.        //1.光加載Person.class文件。  
  3.        //2.對(duì)對(duì)象進(jìn)行初始化。  
  4.        p.function("heihei");  
  5.        //在對(duì)象調(diào)用成員方法時(shí),需要明確兩個(gè)因素:  
  6.                1.對(duì)象  2.獲取參數(shù)列表 

現(xiàn)在可以通過(guò)字節(jié)碼對(duì)象完成以上動(dòng)作。

 
 
 
  1. //加載Person.class文件,獲取Person.class文件對(duì)象的Class對(duì)象  
  2.        Class clazz = Class.forName("Person");  
  3.        //通過(guò)字節(jié)碼文件對(duì)象,對(duì)指定類(lèi)進(jìn)行創(chuàng)建并初始化。  
  4.        Person p=(Person)clazz.newInstance();  
  5.        //通過(guò)對(duì)象調(diào)用成員  
  6.        //p.function("heihei");  

類(lèi)可以作為參數(shù)進(jìn)行傳遞,那么方法也一樣可以作為參數(shù)進(jìn)行傳遞,因?yàn)榉椒ù嬖谟谧止?jié)碼文件內(nèi), 所以可以通過(guò)Class對(duì)象獲取字節(jié)碼文件中的內(nèi)容。

 
 
 
  1. Method m =  Class.getMethod("function",String.class);  
  2.         m.invoke(p,"heihei");  

類(lèi)或者方法都作為參數(shù)傳遞這樣對(duì)于開(kāi)發(fā)到底有那些好處呢?

需求:設(shè)計(jì)一個(gè)主板,為了提高后期的擴(kuò)展性,也就是為了后期提高電腦的額功能,對(duì)外提供了PCI的接口。以方便電腦功能的擴(kuò)展。

 
 
 
  1. interface PCI{   
  2.                    void open();  
  3.                    void close();  
  4.                }  
  5.                class MainBoard{  
  6.                    public void usePCI(PCI p){  
  7.                        p.open();  
  8.                        p.close();  
  9.                        }  
  10.                }  
  11.                class MainBoardDemo{  
  12.                    public static void main(String[] args){  
  13.                        MainBoard mb=new MainBoard();  
  14.                           //mb.usePCI(null);  
  15.                                mb.usePCI(NetCard);  
  16.                        }  
  17.                }  

后期,要進(jìn)行電腦功能的擴(kuò)展,需加入一個(gè)網(wǎng)卡,只需要定義一個(gè)網(wǎng)卡類(lèi)實(shí)現(xiàn)PCI接口,只要覆蓋這個(gè)規(guī)則,主板就可以使用該板卡。

 
 
 
  1. class NetCard implements PCI{  
  2.                       public void open();{  
  3.                              system.out.println("open");  
  4.                         }  
  5.                           public void close();{  
  6.                              system.out.println("close");  
  7.                         }  
  8.                 }  

 那么為了使用其網(wǎng)卡,還需要做一個(gè)步驟就是在已定義好的應(yīng)用程序中,建立網(wǎng)卡對(duì)象,并作為參數(shù)傳入,那么就是對(duì)原有的程序進(jìn)行修改。這樣不利于程序的健壯性。

        可不可以在不修改源碼的基礎(chǔ)上運(yùn)行后期出現(xiàn)的這些子類(lèi)對(duì)象呢?

        只要在前期設(shè)計(jì)時(shí),將后期指定的類(lèi)進(jìn)行對(duì)象的建立,這樣后期的子類(lèi)對(duì)象就不需要再建立對(duì)象,只要將子類(lèi)名稱(chēng)告知即可。

        為了獲取后期對(duì)象,并在前期可以使用,或?qū)ν馓峁┝艘粋€(gè)配置文件。前期程序可以直接操作該配置文件,后期的子類(lèi)只需要將子類(lèi)名稱(chēng)存入配置文件即可。

        這時(shí)就需要?jiǎng)討B(tài)的獲取指定的類(lèi)并預(yù)先創(chuàng)建對(duì)象

 
 
 
  1. 就用到了反射機(jī)制。重新修改一下應(yīng)用程序。  
  2.            class MainBoardDemo{  
  3.                     public static void main(String[] args){  
  4.                         MainBoard mb=new MainBoard();  
  5.                         File file=new File("conf.txt");  
  6.                         BufferenReader buff = new BufferenReader(new FileReader(file));  
  7.                         String className = buff.readLine();  
  8.                         Class clazz = Class.forName(className);  
  9.                         PCI p = (PCI)clazz.newInstance();  
  10.                         mb.usePCI(p);  
  11.                         }  
  12.                 }  

配置文件conf.txt

        當(dāng)后期出現(xiàn)網(wǎng)卡或者聲卡的時(shí)候,只需要將該子類(lèi)的全類(lèi)名存入配置文件即可, 源程序不需要進(jìn)行修改

        在該例中,可以了解,反射給我們的程序帶來(lái)了很強(qiáng)的擴(kuò)展性。


標(biāo)題名稱(chēng):Java中反射機(jī)制詳解
文章來(lái)源:http://www.5511xx.com/article/dhpsdcs.html