- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
@SupportedAnnotationTypes({"com.tg.annotation.Table", "com.tg.annotation.Test"})
public class TgDaoGenerateProcessor extends AbstractProcessor {
private Messager messager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
messager = processingEnv.getMessager();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
messager.printMessage(Diagnostic.Kind.NOTE, "annotations size " + annotations.size());
}
在我的项目中有一个注释为 @Table
的类和一个注释为 @Test
的类
我清理输出目录并在 Intellij 中构建,输出两行:
annotations size 2
annotations size 0
为什么有两条线? javac 做了什么?
如果我重建它,则不会打印任何内容。我想我不修改源代码,所以 javac 不会生成新的 .class
。如果我修改一个用@Table
注释的类并重建,输出为:annotations size 1
。 APT获取@Table
信息,无法获取 @Test
带注释的类信息,因为我不修改带注释的类 @Test
?
我想获取带注释的类信息 @Table
和@Test
并使用它们生成 xml 文件。举个例子:A类注释为@Table
B 类注释为 @Test
APT将获取A类和B类的字段和方法,然后将它们写入一个新文件中。因此,如果只修改类 A ,更改一些字段和方法。构建和 APT 处理器无法获取注释为 @Test
的类 B ,缺少这些信息我无法生成最新的 xml 文件。当然,我清理输出目录并重建,它会起作用,但没有人愿意这样做。那么改变任何一个类,如何让APT处理器可以获取所有类信息。
最佳答案
当您同时提出多个问题时很难回答(这样做是 against StackOverflow policies )......让我们先解决不太相关的问题:
why have tow line ? what have javac done?
这是由于多轮处理造成的。需要多轮处理由注释处理器生成的类注释。请参阅documentation of Processor了解详情。
and I rebuild it nothing output
不要依赖这个。您还没有指定您的构建系统(IntelliJ Ant?Maven?Gradle?)不同的构建系统以不同的方式处理增量编译,并且当项目使用注释处理器时,其中一些可能会完全禁用增量构建。最值得注意的是,Android Gradle 插件和 Gradle 本身的最新版本 have disabled增量编译来解决与注释处理器兼容性差的问题。
如果您需要简单的方法,请让注释处理器的用户也禁用增量编译。或者,您可以重新设计处理器以与增量编译兼容。这是一项复杂的任务,如果您对此感兴趣,我建议您提出一个单独的问题。
I modify a class annotated @Table and rebuild, output annotations size 1
不要使用 process
的第一个参数作为任何事物的指示。如果需要获取带注释的元素,请调用getElementsAnnotatedWith对于您感兴趣的每个注释。
I want to get class info annotated @Table and @Test, use those to generate a xml file
您还没有描述您的处理器的确切目标以及 @Table
的用途和@Test
注释,但如果其中一个类引用另一个类(例如 @Table
带注释的类在其方法签名中包含 @Test
带注释的类型),则可以使用 getTypeElement访问该类,即使 getElementsAnnotatedWith
没有返回它.
关于java - 有关 Java AbstractProcessor 的一些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45528460/
我的 AbstractProcessor即使带注释的方法包含导致编译器错误的代码,也会调用实现。 (即,处理器由目标为 ElementType.METHOD 的注释的存在触发)。 经过一番试验,我得到
鉴于此注释: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface In
我正在构建一个 View 绑定(bind)器,它使用 KotlinPoet 为我的 View 生成一些样板代码。但不知何故,我的注释处理器没有生成 View 所需的代码,因此每当我尝试运行演示应用程序
我正在尝试使用 apt 并生成一些代码,因此我从 here 得到了一个不起作用的示例将其导入 Android Studio,使其工作并放置 here以防其他人想要使用 Android Studio 在
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
给定这些类型: @Retention(RUNTIME) @Target(ANNOTATION_TYPE) public @interface Annotation1 { } @Retention(RU
我试图找到处理 @Deprecated 注释的逻辑。 在 Eclipse 中,打开“类型层次结构”(F4) 只会显示我自己的 AbstractProcessor 实现。 有谁知道处理@Deprecat
我正在编写一个依赖于 AbstractProcessor 类的库,因为我想编写一个很棒的库,所以我也希望有一个很好的覆盖范围。由于预处理器 在编译时工作,我不确定如何测试该代码。 我有一些构建应该失败
我希望将来自 KStream 的窗口化批处理输出组合在一起,并将它们写入辅助存储。 我期待看到 .punctuate() 大约每 30 秒被调用一次。我得到的反而被保存了here . (原文件几千行)
我正在尝试开始创建一个 javax 注释处理器,我现在是从 android studio 做的。我只需要我认为的 gradle 依赖项。现在在 gradle 中,我尝试过以下内容: provided
我有一个扩展 javax.annotation.processing.AbstractProcessor 的类,我想用 apt 运行一些 .java 文件。 如何在 apt 命令行(或在 ant ap
我正在尝试创建一个新的注释,我将使用它来进行一些运行时接线,但是,出于多种原因,我想在编译时通过一些基本检查来验证我的接线是否成功。 假设我创建了一个新注解: @Target(ElementType.
使用javax.annotation.processing.AbstractProcessor生成java代码时 (...) FileObject file=filer.createResource(
我正在为 Apache NiFi 开发自定义处理器。我已经创建了我的处理器的nar并将其放入nifi的lib文件夹中并启动了nifi。我已经在 Eclipse 中设置了远程调试器,并在 onTrigg
我想学习 Annotation,我创建了一个演示项目。但是当我创建一个类extends AbstractProcessor 时,Android Studio 找不到这个类。我该如何添加它。 最佳答案
我是反射(reflection)中的新手。有什么方法可以检测特定方法在哪里被调用?例如: public class MyClass { public static void method(){
我是一名优秀的程序员,十分优秀!