JAVA資格認(rèn)證(Java反射機(jī)制系列:例子分析)

字號(hào):

上一篇中,通過(guò)例子我們知道了如何利用反射機(jī)制創(chuàng)建對(duì)象,獲得類變量和調(diào)用方法等。創(chuàng)建對(duì)象的語(yǔ)句是 Class cla = Class.forName(type); Object obj = cla.newInstance(); 這里newInstance()實(shí)際上是使用了該類的默認(rèn)無(wú)參構(gòu)造方法。如果我們要調(diào)用其它的構(gòu)造方法就要稍微復(fù)雜一點(diǎn)。比如我們要?jiǎng)?chuàng)建一個(gè)StringBuffer對(duì)象,用new 操作符應(yīng)該是StringBuffer br = new StringBuffer("example");用反射機(jī)制則要有以下步驟。
    首先,獲得StringBuffer類的描述。
    Class cla = Class.forName("java.lang.StringBuffer");其次,要?jiǎng)?chuàng)建參數(shù)類型數(shù)組Class[] . Class[] paraTypes = new Class[1];paraTypes[0]=String.class;然后,通過(guò)cla 和 paraTypes 獲得Constructor 對(duì)象。
    Constructor constructor = cla.getConstructor(paraTypes);接著,創(chuàng)建傳入的參數(shù)列表Object[]. Object[] paraLists = new Object[1]; paraLists[0]="color";最后,得到我們所要得對(duì)象。Object obj = constructor.newInstance(paraLists);如果我們paraTypes及paraLists設(shè)為null或長(zhǎng)度為0,就可以用上述步驟調(diào)用StringBuffer的無(wú)參構(gòu)造方法。類似地,我們可以調(diào)用對(duì)象中的有參方法。比如我們做如下操作br.insert(4, ’u’);用反射機(jī)制實(shí)現(xiàn)如下。
    Class[] paratypes = new Class[]{int.class,char.class};
    Method method = cla.getMethod("insert", paratypes);
    Object[] paralists = new Object[]{4,’u’};
    method.invoke(obj, paralists);
    反射機(jī)制給予我們運(yùn)行時(shí)才確定對(duì)象類型的便利,然而它也有顯著的缺點(diǎn)。
    1,代碼笨拙冗長(zhǎng)。比如本來(lái)一句br.insert(4, ’u’);可以解決的問(wèn)題現(xiàn)在要用到四句。
    2,損失了編譯時(shí)類型檢查的好處。這使得你要對(duì)付更多的異常。
    3,性能損失。用反射機(jī)制運(yùn)行的時(shí)間更久。
    <>中給出的建議是“普通應(yīng)用不應(yīng)在運(yùn)行時(shí)刻以映像方式訪問(wèn)對(duì)象,只是在很有限的情況下使用”。那么在什么地方會(huì)用到反射機(jī)制呢。已有的較熟悉應(yīng)用是我們的IDE及一些框架。比如eclipse,編程時(shí)ctrl+space彈出的建議就是用到反射機(jī)制。比如Spring讀取配置文件后生成對(duì)應(yīng)的對(duì)象。還有RPC系統(tǒng)也會(huì)用到。對(duì)于一般的應(yīng)用軟件,你可以在工廠方法中用到它