注解处理时获取Android个应用包名

Get Android application package name during annotation processing

我正在开发一个库,该库在编译时(点击构建时)根据带注释的 classes 和字段生成 class 文件。至此一切正常(可以生成class)。但是,我在启动应用程序时如何找到这样一个生成的 class 有一个问题(class 需要在 ApplicationonCreate 方法中访问) .

代码看起来像这样:

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

并且在 class MyLib 中,需要完成这样的事情:

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

问题是我不知道如何在不知道包名的情况下找到class,也不知道如何找到它的包名。

我能想到一种方法是将包名称传递到一个注解中,例如 @MyAnnotation("package_name") 以便在编译时生成 class 并获取class 在运行时。

不过,我只是想知道是否还有其他更简洁的方法可以实现这一点。有没有办法: 1.注解处理时获取Application包名 2.在不知道它的包(只知道Application包)的情况下,在运行时寻找一个class。我确实在 MyLib.setup() 内尝试了 Package.getPackages()。然而,这 returns 是一个空数组。

覆盖应用程序 class

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 扩展 class 中获取注释元素的包名 你可以使用这个

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

其中元素是 TypeElement instance

这是一个经过深入研究的问题。最简单的方法是让您的用户注释应用程序包(是的,annotating a package is possible) or pass the name of app package via javac parameter(android-apt 和新版本的 Android Gradle 插件对这些有本地支持)。这很便宜,可以让你快速行动。

启发式获取包名称是可能的,AndroidAnnotations 有一大块代码(更准确地说,是 finding AndroidManifest.xml and locating R.java),两者都可以给出应用程序包。当心,这些方法并不漂亮。请注意,AndroidAnnotations 具有插件系统,因此您可以访问该功能,而无需通过编写插件并声明对其主处理器的依赖来重新完成它们的工作。

最后,您可以编写自己的 Gradle 插件并直接访问此类信息。