JAVA資格認證(Java反射機制系列:例子分析)

字號:

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