当前位置: 首页 > 知识库问答 >
问题:

Java注释处理器忽略父类中的注释

邓元白
2023-03-14

我有下面的课程。两个注释(AnnotA和AnnotB),一个类的子类。java'(带@AnnotA)及其“父”基。java'(带有@AnnotB)。

编译子对象时。java,我的注释处理器报告AnnotA,但它不报告在Base中找到的注释(AnnotB)。JAVA

安诺塔。JAVA

import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface AnnotA
    {
    }

阿诺特。JAVA

import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface AnnotB
    {
    }

基础JAVA

@AnnotB
public class Base
    {
    }

小孩JAVA

@AnnotA
public class Child extends Base
    {
    }

MyProc。JAVA

import javax.annotation.processing.*;
import java.lang.annotation.*;
import javax.lang.model.*;
import javax.lang.model.element.*;
import javax.tools.*;
import java.util.*;
import java.util.stream.*;

@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyProc  extends AbstractProcessor
    {
    @Override
    public Set<String> getSupportedAnnotationTypes()  {
        final Set<String> set = new HashSet<>();
        set.add("AnnotA");
        set.add("AnnotB");
        return set;
        }
    @Override
    public boolean process(final Set<? extends TypeElement> annotations,
        final RoundEnvironment roundEnv
        ) {
        roundEnv.getElementsAnnotatedWith(AnnotA.class).stream().
            forEach(E->{System.err.println("AnnotA>>" + E + " "+ E.getAnnotation(AnnotA.class));});

        roundEnv.getElementsAnnotatedWith(AnnotB.class).stream().
            forEach(E->{System.err.println("AnnotB>>" + E + " "+ E.getAnnotation(AnnotB.class));});
        return true;
        }
    }

这是编译过程及其输出,正如您所看到的,没有关于AnnotB的消息。java是Child的父级。JAVA

rm -rf tmp
mkdir -p tmp/META-INF/services
javac -d tmp MyProc.java
echo "MyProc" > tmp/META-INF/services/javax.annotation.processing.Processor
jar cvf myproc.jar -C tmp .
added manifest
ignoring entry META-INF/
adding: META-INF/services/(in = 0) (out= 0)(stored 0%)
adding: META-INF/services/javax.annotation.processing.Processor(in = 7) (out= 9)(deflated -28%)
adding: AnnotB.class(in = 363) (out= 221)(deflated 39%)
adding: MyProc.class(in = 2512) (out= 1118)(deflated 55%)
adding: AnnotA.class(in = 363) (out= 221)(deflated 39%)
##
mkdir -p tmp
javac -processorpath myproc.jar -d tmp Child.java
AnnotA>>Child @AnnotA()
warning: Implicitly compiled files were not subject to annotation processing.
  Use -implicit to specify a policy for implicit compilation.
1 warning
rm -rf tmp

这个代码怎么了?谢谢

共有1个答案

柯骏
2023-03-14

使用@Inherited继承注释。

如何在Java中使用@inherited注释?

 类似资料:
  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 问题内容: 我有一个名为@Pojo的自定义注释,可用于自动生成Wiki文档: 我这样使用它: 注释资源方法,以便注释处理器可以自动生成描述所需资源和类型的Wiki页面。 我需要在注释处理器中读取该字段的值,但出现运行时错误。 在我的处理器的源代码中,我有以下几行: 但实际的类不适用于处理器。我认为我需要一个替代品来代替实际课程。我不确定该怎么买。 我得到的错误是: 该是我的一个提到的一类注释。 不

  • 我试图使用Jackson注释来重新命名序列化过程中产生的一些json标签。所有注释都编译得很好,当我运行时,除了所有Jackson注释之外,Jackson序列化工作完全被忽略。即使像@jsonignore或@jsonproperty这样的基本命令对json响应也没有影响。构建路径中的库有: 下面是我需要序列化的一个类的代码示例:

  • 有什么想法为什么@primary在这里没有被考虑在内吗?

  • 我们有一个注释,允许我们使用一个民意调查消费者来消费Kafka消息。它是为长时间运行的作业而设计的,因此一个线程正在处理消息,而另一个线程仍然可以用于轮询,以防止Kafka认为我们的服务失败,并重新平衡消费者。 我们正在使用Spring AOP。 课程: 我们一次只想处理一条消息,因此标志用于决定是现在处理消息,还是以后重新排队。 用于处理消息(使用),然后将消息回复给Kafka。这是通过

  • 需要注释处理器的帮助。我创建了一个简单的注释处理器,它使用@autoservice注释来检查注释的字段是否为最终字段。但它没有显示任何编译时错误。这是我的配置 注释: 注释处理器: pom文件: 测试文件: