2017-04-17 30 views
3

我正在開發一個需要訪問實現它的應用程序的佈局項目的庫。我知道如何去做的唯一方法就是反思。換句話說,如果我創建一個構造到音樂庫API是這樣的:從我的Android庫訪問應用程序R類

public MyLibraryAPI(String packageName) { 
    Class appR = Class.forName(String.format("%s.R", packageName)); 
    ... 
} 

而且,開發者將與他的包名稱作爲構造函數參數實例庫。

我最終需要的是讓我的內部類知道開發人員佈局(.xml文件)中使用的Android視圖 - id和類型。有沒有辦法實現這一點,沒有反思和逃避性能開銷?我敢肯定,這是無法完成的,但如果有專家看到我沒有注意到的情況,我會問。

編輯:此外,默認情況下,proguard混淆了保護代碼,但因此無法爲運行時實現反射的手段提供JVM,所以如果我使用反射,我不得不要求開發人員轉爲他或她的R課關閉proguard混淆,這是一個無賴。

+1

你可以使用註釋處理器嗎?類似於Butterknife的工作方式? –

+0

是的,我可以使用註釋處理將執行移動到編譯時。但是,從開發人員的角度來看,這需要更大的努力,因爲他必須爲綁定提供註釋。或者我錯了?我仍然只是辯論,我並不傾向於任何一方。無論如何感謝您的回覆。 – NitroNbg

回答

1

對Android的反思極其昂貴。一些好的和流行的圖書館,如Roboguice已經倒下,部分原因是反射的性能成本。

我懷疑某種代碼生成是正確的解決方案。 Dagger 2Butter KnifeData Binding Library是使用代碼生成的Android庫的成功例子。由於數據綁定庫對XML執行檢查,因此它必須可用於編譯階段的代碼生成庫,並且可以基於此實現:以下鏈接指向source jars at Maven Central

除此之外,是的,似乎會有易用性和難以實施之間的一些妥協。如果你強迫你的消費者使用你的註釋來註釋他們的類,它就變得更難使用,但可能更容易實現。如果您限制自己檢查XML和生成的文件並從中生成代碼,那麼我認爲您的工作會變得更加困難。另一方面,使用註釋變得相當普遍,它可能不會成爲用戶的一個問題。

祝你好運!

相關問題