Effective Java之接口优先于反射机制(五十三)
核心反射機制java.lang.reflect提供了“通過程序來訪問關于已裝載的類的信息”的能力,給定一個Class實例,可以獲得Constructor、Method、Field實例,這些對象提供“通過程序來訪問類的成員名稱、域類型、方法簽名等信息”的能力。
反射機制允許一個類使用另一個類,即使當前者被編譯的時候后者還根本不存在,存在的代價:
1.失去編譯時類型檢查的好處,包括異常檢查。
2.執行反射訪問所需的代碼很長。
3.性能上的損失。
?
反射機制的使用場景
反射功能只是在設計時被用到,通常,普通應用程序在運行時不應該以反射的方式訪問對象。
有些復雜的應用程序需要使用反射機制,包括類瀏覽器、對象檢測器、代碼分析工具、解釋型的內嵌式系統。在RPC中使用反射機制也是合適的,這樣就不再需要存根編譯器。
對于有些程序,必須用到在編譯時無法獲取的類,但是在編譯時存在適當的接口或者超類,通過它們可以引用這個類,就可以以反射的方式創建實例,然后通過它們的接口或者超類,以正常的方式訪問這些實例。
?
?
反射機制的例子
創建Set實例,吧命令行參數插入到集合中,然后打印該集合,其中第一個參數指定打印的結果,如果是HashSet以隨機的方式打印出來,如果是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); }這相當于一個集合測試器,通過反射測試Set實現,同時,它也可以作為通用的集合性能分析工具。
這種方法足以完成成熟的服務提供者框架。
具體怎么實現,可以去看一下這篇文章
服務提供者框架
總結
以上是生活随笔為你收集整理的Effective Java之接口优先于反射机制(五十三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective Java之当心字符串
- 下一篇: Effective Java之谨慎地使用