2016-04-25 84 views
0

我正在學習有關Dagger 2 - 依賴注入庫的Android - 在許多文章中,當作者日期比較匕首2與它的舊版本(匕首),他這樣說:什麼是具體調用,它與Reflection有什麼不同?

(...)

的新版本,如許,解決了許多原來的問題:

  • 沒有更多的思考 - 一切都爲具體的調用來完成(ProGuard的工作,沒有配置在所有)

(...)

來源:https://blog.gouline.net/dagger-2-even-sharper-less-square-b52101863542#.w33tjdttt

我知道Reflection can be used for observing and modifying program execution at runtime,但對於這些混凝土呼叫?它們是什麼以及它們與反射有什麼不同?

Obs .:如果有人可以提供一些關於如何創建/使用這些具體調用的示例代碼/用例,那將會很棒。

+2

「具體調用」指的是用'foo.bar()'調用一個像你一樣的方法。他們沒有什麼特別之處,他們的整個觀點是他們不是特別的;他們只是如何正常編寫代碼。 –

回答

1

呃...匕首使用了一些反射和匕首2 ...沒有。

Dagger 2使用註釋處理到生成代碼編譯時間。所有那些你放在你的類上的註釋,@Component,@Module等等,都會向匕首2編譯器發出信號。

它將使用它們來創建依賴關係圖,驗證它,然後創建代碼。有這種做法一些好處,比匕首:

  • 編譯時間驗證(如果您有依賴循環,或不能提供的東西,它不會編譯和你編譯時得到一個錯誤,而不是運行程序)
  • 性能(everyting只是簡單的java —不涉及任何反射)
  • Proguard的「支持」(通過不依靠反射,會出現使用ProGuard沒有問題)
時異常

因此,正如在評論中已經提到的,具體調用在這種情況下將意味着消除反射和生成代碼。 Dagger 2將生成大量源文件,您可以使用該文件輕鬆調試代碼。

1

混凝土電話,在那裏你直接調用該方法,並編譯器創建一個調用指令:

System.currentTimeMillis(); 

這是調用方法最快的方法,但如果你知道在編譯期它只時間你需要調用哪種方法(這是99%的情況)。這是你如何正常編寫代碼。

有時候,你不知道你需要調用什麼方法。也許用戶或文件告訴你需要調用哪種方法。爲此,您需要使用反射。這是慢得多,但允許你動態指示調用哪個方法:

Scanner in = new Scanner(System.in); 
String method = in.next(); 
// Reflection invocation: 
Object result = System.class.getMethod(method).invoke(); 
System.out.println("Result was: " + result); 

這將讓你currentTimeMillis鍵入到命令行,並返回值。你也可以輸入nanoTime,它也會打印結果。

因爲反射是額外的間接層(沒有在上面的反射代碼沒有System.currentTimeMillis()電話 - 但它可能稱之爲!),它通過掃描編譯後的代碼進行操作的工具和重寫方法調用將失敗正確處理反射電話。

相關問題