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

Java注释处理器,带注释的注释类型

秦炜
2023-03-14

我正在使用注释处理器来处理方法参数的注释。

public void multiply(@IntArg int a){
    ...
}

用于参数的注释类型有一个注释@参数

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER})
@Argument
public @interface IntArg {
}

现在,当注释处理器运行时,我想检查参数注释(@IntArg)是否有参数注释。我通过执行以下代码来实现这一点。

VariableElement param = ... //The parameter
for (AnnotationMirror mirror : param.getAnnotationMirrors()) {
    Argument arg = mirror.getAnnotationType().getAnnotation(Argument.class);
    if(arg != null) {//Args is always null
        ...
    }
}

由于某种原因,arg始终为空。是否有注释未返回的原因?

共有1个答案

仲璞瑜
2023-03-14

我想你需要的是:

VariableElement param = ...;
for (AnnotationMirror mirror : param.getAnnotationMirrors()) {
    DeclaredType t = mirror.getAnnotationType();
    // (Filter out ErrorType: see my addendum.)
    if (t.getKind() == TypeKind.DECLARED) {
        Element e = t.asElement();
        // (This should always be true.)
        if (e.getKind() == ElementKind.ANNOTATION_TYPE) {
            Argument a = e.getAnnotation(Argument.class);
            // ...
        }
    }
}

来自DeclaredTypeTypeElement

TypeElement表示类或接口元素,DeclaredType表示类或接口类型,后者是前者的使用(或调用)。

因此,如果您想以某种方式检查一个声明,那么您需要的是元素而不是类型。

注意,我还可以在上面的代码片段中将e转换为TypeElement;只是没有什么特别的理由。

关于我的编辑的快速补遗:我认为在这里检查类型可能是正确的,因为它可以返回错误类型。如果我这样做,可能会发生这种情况:

void m(@IntArg @TypeWhichDoesntExist int arg0) {
}

其中,类型whichdoesntexist是一种不存在的类型,例如,因为它没有导入,因为它是由另一个注释处理器生成的接口,或者因为它完全不存在。(注释处理器可以使用不编译的代码调用。)

我认为这不会对我之前编写示例的方式造成问题,但我认为值得指出的是,这可能会发生。

 类似资料:
  • 我有下面的课程。两个注释(AnnotA和AnnotB),一个类的子类。java'(带@AnnotA)及其“父”基。java'(带有@AnnotB)。 编译子对象时。java,我的注释处理器报告AnnotA,但它不报告在Base中找到的注释(AnnotB)。JAVA 安诺塔。JAVA 阿诺特。JAVA 基础JAVA 小孩JAVA MyProc。JAVA 这是编译过程及其输出,正如您所看到的,没有关于

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

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

  • 问题内容: 在阅读 Java 中的自定义注释处理器的代码时,我注意到处理器方法中的这段代码: 碰巧我也在使用自定义注释处理器,所以我想在我的注释处理器中使用上面的代码段。 我以这种方式尝试了上面的代码: & 这条路: 但我没有注意到处理器行为的任何变化。我得到了支票,但看不到有什么用。 我想知道在处理特定回合时有用的用例。 问题答案: 这两项检查都很重要,但是直到在同一项目中一次运行多个注释处理器

  • 主要内容:使用Rem语句注释,注释使用::声明为创建的脚本添加注释或文档总是一个好习惯。 这是一个维护脚本用来理解脚本实际所做的事情所必需的注释。 例如,考虑下面这段没有注释形式的代码。 如果一个没有任何注释的脚本,普通人试图理解脚本,那么需要很多时间来理解脚本做些什么工作。 使用Rem语句注释 有两种方法可以在批处理脚本中创建注释; 一个是通过命令。 语句后的任何文本都将被视为注释,不会被执行。 以下是此声明的一般语法。 语法 其中是需要添

  • 在阅读Java中的自定义注释处理器的代码时,我注意到处理器的方法中的这段代码: 碰巧我也在处理一个自定义注释处理器&我想在我的注释处理器中使用上面的代码片段。 但是我没有注意到处理器的行为有任何变化。我得到了检查,但我看不出有什么用。 我想知道在处理某个回合时使用有用的用例。