2016-06-24 55 views
2

我正在研究一個庫,該庫在編譯時根據帶註釋的類和字段生成類文件(打擊時)。到目前爲止,一切都很好(可以生成類)。但是,在啓動應用程序時(如需在onCreate方法Application中訪問該類),如何找到此類生成的類時遇到問題。在註釋處理過程中獲取Android應用程序包名稱

的代碼看起來是這樣的:

- Application class of an Android app - 
@Override 
public void onCreate() { 
    super.onCreate(); 
    MyLib.setup(this); 
} 

和類MyLib內,需要做的事情是這樣的:

public void setup(Application app) { 
    String className = String.format("%s.%s", "packageName", "generatedClassName"); 
    Class<?> myGeneratedClass = Class.forName(className); 
    ... 
} 

的問題是我不知道怎麼找該類不知道它的包名,也不知道如何找到它的包名。

我能想到的方法是將包名稱傳遞給@MyAnnotation(「package_name」)之類的註釋,以便在編譯時生成類並在運行時獲取該類時使用它。

但我只是想知道是否有其他更乾淨的方法來實現這一點。有什麼辦法可以: 1.在註解處理期間獲取應用程序包名稱 2.在運行時查找類而不知道其包(僅瞭解應用程序包)。我在MyLib.setup()內嘗試過Package.getPackages()。但是,這將返回一個空數組。

回答

3

這是一個經過深入研究的問題。最簡單的方法是讓用戶註釋應用程序包(是,annotating a package is possible)或通過javac parameter(android-apt和新版本的Android Gradle插件對這些應用程序提供本機支持)傳遞應用程序包的名稱。這很便宜,並會讓你快點。

獲取軟件包名稱啓發式是可能的,AndroidAnnotations有一個代碼塊(更確切地說,對於finding AndroidManifest.xmllocating R.java),兩者都可以發出應用程序包。要小心,這些方法並不漂亮。請注意,AndroidAnnotations具有插件系統,因此您可以通過編寫插件並在其主處理器上聲明依賴關係來訪問該功能,而無需重新開展工作。

最後,您可以編寫自己的Gradle插件並直接訪問這類信息。

+0

非常感謝您的回答。非常豐富。我很高興地發現AndroidAnnotations有這些方法。我發現插件選項非常有趣。你能否提供一些關於它的信息?謝謝 –

0

覆蓋應用類

private static Context sContext; 

    @Override 
     protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     sContext = base; 
    } 

    public static Context getAppContext() { 
     return sContext; 
    } 

要獲得軟件包名稱

YourApplication.getAppContext().getPackageName(); 

編輯: 要想從AbstractProcessor 擴展類註釋元素的包名,你可以使用這個

final String originalPackageName = element.getEnclosingElement().toString(); 

where el ement is TypeElement instance

+0

我知道如何做到這一點,但正如我在問題中提到的那樣,我需要在編譯時獲取包名,這意味着它必須以某種方式從註釋處理器訪問(即,在公共布爾過程中(Set <?extends TypeElement> annotations,RoundEnvironment roundEnv)'函數。但是謝謝 –

+0

已添加。希望它可以幫助 – thealeksandr

+0

是的,如果我註釋Application類並使用它來獲取包,這可以實現。在我的情況下,我使用了另一個類的註釋,而且我不願意爲Application類添加另一個註釋,只是爲了在編譯時獲取它的包 - 因爲這需要用戶額外的步驟來使用該庫。寫作。我不確定是否有可能做到這一點,而不是做你提到的和我在問題中提到的。但在決定採取這兩種選擇之前,仍然想尋找另一種解決方案。 –

相關問題