【问题标题】:Java annotation processor ignores annotation in parent classJava注解处理器忽略父类中的注解
【发布时间】:2017-05-29 14:11:12
【问题描述】:

我有以下课程。两个注解(AnnotAAnnotB),一个类 'Child.java'(带有@AnnotA)及其'父'Base .java'(带有@AnnotB)。

在编译 Child.java 时,我的注解处理器会报告 AnnotA,但它不会报告在 Base.java 中找到的注解 (AnnotB)。

AnnotA.java

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

AnnotB.java

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

Base.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 的消息,而 Parent.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

这段代码有什么问题? 谢谢。

【问题讨论】:

  • 据我所知,这是预期的行为 - 注释不会自动从超类继承。当你找到一个类时,如果你想知道一个注解存在于类层次结构的某个地方,你必须明确地检查它的超类。
  • 在我尝试将 '@Inherited' 添加到 AnnotB 之后/我想在每次使用 @IncludeInJar 注释类时在 jar 中包含一个 java 源代码,但它没有看到@IncludeInJar 当这个注解在父类中时。

标签: java annotations


【解决方案1】:

【讨论】:

  • 谢谢,我已将 @Inherited 添加到 AnnotB 。现在的输出是AnnotA&gt;&gt;Child @AnnotA() AnnotB&gt;&gt;Child @AnnotB(),但我想看到AnnotA&gt;&gt;Child @AnnotA() AnnotB&gt;&gt;Base @AnnotB()(更长的故事,我想在每次用@IncludeInJar注释类时包含一个java源代码)
  • 如果您检查子类,您将获得有关子类的信息。如果您需要有关基本类型的信息,请检查基本类型。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多