在注释处理期间获取Android应用程序包名称

时间:2016-06-24 03:18:47

标签: java android annotation-processing

我正在开发一个库,它在编译时(打击构建时)基于带注释的类和字段生成类文件。到目前为止一切都很好(可以生成类)。但是,我在启动应用程序时如何找到这样生成的类时遇到问题(需要在onCreate的{​​{1}}方法中访问该类。)

代码看起来像这样:

Application

在课程- Application class of an Android app - @Override public void onCreate() { super.onCreate(); MyLib.setup(this); } 中,需要完成类似的事情:

MyLib

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

我可以想到一种方法是将包名称传递给注释之一,如@MyAnnotation(“package_name”),以便在编译时生成类并在运行时获取该类时使用它。

然而,我只是想知道是否还有其他更清洁的方法来实现这一目标。有没有办法: 1.在注释处理期间获取应用程序包名称 2.在运行时查找一个类而不知道它的包(只知道Application包)。我确实在public void setup(Application app) { String className = String.format("%s.%s", "packageName", "generatedClassName"); Class<?> myGeneratedClass = Class.forName(className); ... } 内尝试了Package.getPackages()。但是这会返回一个空数组。

2 个答案:

答案 0 :(得分:3)

这是一个研究得很好的问题。最简单的方法是让用户注释应用程序包(是的,annotating a package is possible)或通过javac parameter传递应用程序包的名称(android-apt和新版本的Android Gradle插件具有本机支持) 。这很便宜,可以让你快速前进。

启发式获取包名称是可能的,并且AndroidAnnotations有一大堆代码(更准确地说,对于finding AndroidManifest.xmllocating R.java),这两者都可以提供应用程序包。请注意,这些方法并不漂亮。请注意,AndroidAnnotations具有插件系统,因此您可以通过编写插件并声明对其主处理器的依赖来重新访问该功能。

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

答案 1 :(得分:1)

覆盖应用程序类

$conn

获取包名称

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

其中element是TypeElement final String originalPackageName = element.getEnclosingElement().toString();