Effective Java之接口优先于反射机制(五十三)
核心反射機(jī)制java.lang.reflect提供了“通過程序來訪問關(guān)于已裝載的類的信息”的能力,給定一個(gè)Class實(shí)例,可以獲得Constructor、Method、Field實(shí)例,這些對(duì)象提供“通過程序來訪問類的成員名稱、域類型、方法簽名等信息”的能力。
反射機(jī)制允許一個(gè)類使用另一個(gè)類,即使當(dāng)前者被編譯的時(shí)候后者還根本不存在,存在的代價(jià):
1.失去編譯時(shí)類型檢查的好處,包括異常檢查。
2.執(zhí)行反射訪問所需的代碼很長(zhǎng)。
3.性能上的損失。
?
反射機(jī)制的使用場(chǎng)景
反射功能只是在設(shè)計(jì)時(shí)被用到,通常,普通應(yīng)用程序在運(yùn)行時(shí)不應(yīng)該以反射的方式訪問對(duì)象。
有些復(fù)雜的應(yīng)用程序需要使用反射機(jī)制,包括類瀏覽器、對(duì)象檢測(cè)器、代碼分析工具、解釋型的內(nèi)嵌式系統(tǒng)。在RPC中使用反射機(jī)制也是合適的,這樣就不再需要存根編譯器。
對(duì)于有些程序,必須用到在編譯時(shí)無法獲取的類,但是在編譯時(shí)存在適當(dāng)?shù)慕涌诨蛘叱?#xff0c;通過它們可以引用這個(gè)類,就可以以反射的方式創(chuàng)建實(shí)例,然后通過它們的接口或者超類,以正常的方式訪問這些實(shí)例。
?
?
反射機(jī)制的例子
創(chuàng)建Set實(shí)例,吧命令行參數(shù)插入到集合中,然后打印該集合,其中第一個(gè)參數(shù)指定打印的結(jié)果,如果是HashSet以隨機(jī)的方式打印出來,如果是TreeSet按照字母順序打印出來的程序:
public static void main(String[] args) {Class<?> c = null;try {c = Class.forName(args[0]);} catch(ClassNotFoundException e) {System.out.println("Class not found");System.exit(1);}Set<String> s = null;try {s = (Set<String>) c.newInstance();} catch(IllegalAccessException e) {System.out.println("Class not accessible");System.exit(1);} catch(InstantiationException e) {System.out.println("Class not instantiable");System.exit(1);}s.addAll(Arrays.asList(args).subList(1, args.length));System.out.println(s); }這相當(dāng)于一個(gè)集合測(cè)試器,通過反射測(cè)試Set實(shí)現(xiàn),同時(shí),它也可以作為通用的集合性能分析工具。
這種方法足以完成成熟的服務(wù)提供者框架。
具體怎么實(shí)現(xiàn),可以去看一下這篇文章
服務(wù)提供者框架
總結(jié)
以上是生活随笔為你收集整理的Effective Java之接口优先于反射机制(五十三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective Java之当心字符串
- 下一篇: Effective Java之谨慎地使用