【问题标题】:Annotation processor with android library (realm)带有android库的注释处理器(领域)
【发布时间】:2017-08-15 15:08:59
【问题描述】:
我正在尝试创建一个在 realm.io 之上工作的注释处理器
遗憾的是,要使用领域,您需要一个 android 项目,而要创建一个注释处理器,您需要一个 java (为了导入 javax.annotation.processing.*)
任何人都知道在 android 库中导入 AbstractProcessor 和所有其他需要的东西的方法吗?我找不到执行此操作的方法(已将 targetCompatibility 和 sourceCompatibility 切换到 1.7)
【问题讨论】:
标签:
java
android
realm
annotation-processing
【解决方案1】:
一种在 android 库中导入 AbstractProcessor 和所有其他需要的东西的方法
更好的问题是:你为什么想要那个?
如果您认为您的处理器将依赖于 Realm 类(或任何其他 Android 类),那么事实并非如此。当您编写使用 APT Mirror API 的代码时,您不必直接引用这些类,只需通过名称即可。生成的代码将类似于 like this:
DeclaredType theBinder = lookup("android.os.Binder");
DeclaredType theIInterface = lookup("android.os.IInterface");
DeclaredType theCreator = lookup("android.os.Parcelable.Creator");
...
private DeclaredType lookup(CharSequence name) {
return types.getDeclaredType(elements.getTypeElement(name));
}
然后您将使用Types 和Elements 实用程序类的方法继续操作创建的TypeMirror。您还可以将这些镜像转换为其他格式,例如 Square 的 JavaPoet TypeName,但您实际上不必这样做,因为 Mirror API 提供了您可能需要的大多数功能。
您绝对不想在注释处理器中加载 Realm 的类。首先,根本不需要这样做。但更重要的是,正如您在问题中指出的那样,通常不可能在注释处理器和它的运行时设备之间共享相同的设置。这个问题不是 Android 独有的,例如,没有人希望设置成熟的应用程序服务器来编译使用 JAXB 感知注释处理器的服务器程序。
如果您真的想要在处理器中使用 Realm 的一些代码,并且它不能作为单独的 Java 库提供,最简单的方法就是将该代码复制到您的处理器。