如何扩展Java注释?

2022-08-31 17:01:18

在我的项目中,我使用预定义的注释:@With

@With(Secure.class)
public class Test { //....

的源代码:@With

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface With { 

    Class<?>[] value() default {};
}

我想写 自定义注释 ,这将具有与.如何做到这一点?@Secure@With(Secure.class)


如果我喜欢这个怎么办?它会起作用吗?

@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

答案 1

正如piotrek所指出的,你不能在继承的意义上扩展注释。不过,您可以创建聚合其他批注的批注:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SuperAnnotation {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SubAnnotation {
    SuperAnnotation superAnnotation();
    String subValue();
}

用法:

@SubAnnotation(subValue = "...", superAnnotation = @SuperAnnotation(value = "superValue"))
class someClass { ... }

答案 2

来自 Java 语言规范,第 9.6 章 注释类型

不允许使用扩展条款。(批注类型隐式扩展 。annotation.Annotation

因此,您无法扩展注释。您需要使用其他一些机制或创建一个代码来识别和处理您自己的注释。Spring允许您将其他Spring的注释分组到您自己的自定义注释中。但仍然没有扩展。


推荐