gpt4 book ai didi

java - Android 注释处理器从不同模块访问带注释的类

转载 作者:行者123 更新时间:2023-11-30 10:31:45 26 4
gpt4 key购买 nike

我有一个包含 2 个模块的 Android Studio 项目:A 和 B。(我这里不包括注释处理器和注释模块)

B 依赖于 A。

B是Android库模块,A是简单的Java库模块。我在模块 B 上也有一个注释处理器。

我面临的问题是:

我想根据放置在两个模块 - A 和 B 中的注释文件生成一些代码。问题来自注释处理器的工作方式 - 仅使用源代码文件 *.java -不是编译的 *.class 的。不幸的是,在 B 的编译过程中,注释处理器无法访问 A 中的那些源文件...

作为一种解决方案,我唯一能想到的,即使是一个丑陋的解决方案,就是将模块 A 中带有注释类的文件夹作为源集包含到模块 B 中。这样我给模块 B在编译期间访问这些文件。

sourceSets {
main {
java {
srcDirs = ['src/main/java', '../module_A/src/main/java/path/to/annotated/classes/folder']
}
}
}

这解决了问题 - 现在注解处理器可以访问两个模块中所有带注解的类,但是......

不幸的是,它引入了另一个问题......那些来自模块 A 的注释类现在被编译了两次。它们包含在模块 A 的 JAR 文件和模块 B 的 AAR 文件中。

问题 1: 是否有另一种方法可以从运行在 B 上的注释处理器访问模块 A 的那些源文件??? (根据我所能找到的,答案是否定的,但检查...)

问题2:如何从模块B的AAR最终包中排除那些编译后的文件(重复的)?

问题 3: 也许……这是一种绝对错误的方法?有什么建议吗?

提前致谢!

最佳答案

不,您无法仅使用 java.lang.model API 实现您想要的。至少不是没有一些额外的技巧。

问题不在于二进制与源代码。注释处理器可以使用 Elements#getTypeElement内部检查已编译的类以及源定义的类:

Elements elementUtil = processingEnvironment.getElementUtils();
TypeElement integerClass = elementUtil.getTypeElement("java.lang.Integer");
TypeElement myClass = elementUtil.getTypeElement("currently.compiled.Class");

但是您仍然需要在编译类路径上有类才能观察到它,并且该类必须处于编译过程中才能对 getElementsAnnotatedWith 可见。

您可以使用类似 FastClasspathScanner 的工具来解决以后的限制:它将使用自己的机制在编译的字节码中查找注释,并在编译过程中单独向您报告。但是你不能解决类路径问题:如果你在编译类路径中没有一些依赖,它就不能被处理。因此,您必须将模块编译在一起——要么通过将它们合并为一个(就像您所做的那样),要么通过声明一个依赖另一个。在以后的情况下,您可能无法使用 getElementsAnnotatedWith,但 getTypeElement 和 FastClasspathScanner 可以使用。

关于java - Android 注释处理器从不同模块访问带注释的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43040366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com