在Java中使用一个注释作为另一个注释的成员



我是Java注释的新手。我在我的Spring引导应用程序中使用了如下注释:

原始注释定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {

EntityType entityType();
ActionType actionType();
Resource resourceType();
}

现在我想把actionType()resourceType()移动到一个不同的注释中,比如MySubAnnotation,并在上面的原始注释MyAnnotation中使用它,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {

EntityType entityType();
MySubAnnotation mySubAnnotation();
}

但是我在使用这个的时候遇到了一个问题:

@MyAnnotation(entityType = EntityType.MY_ENTITY,
mySubAnnotation = <???>)  <---HERE I CANNOT UNDERSTAND WHAT TO SPECIFY
@MySubAnnotation(actionType=ActionType.UPDATE, 
resourceType=Resource.MY_RESOURCE)
public void myMethod() {
...
}

如上所述,我不明白该为子注释指定什么。有人能帮帮忙吗?谢谢。

您没有包含MySubAnnotation的声明。除此之外,对于嵌套注释,实际注释值的语法并没有什么不同。你只需要把它放在=:

后面
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
EntityType entityType();
MySubAnnotation mySubAnnotation();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface MySubAnnotation {
ActionType actionType();
Resource resourceType();
}
@MyAnnotation(
entityType = EntityType.MY_ENTITY,
mySubAnnotation = @MySubAnnotation(
actionType = ActionType.UPDATE,
resourceType = Resource.MY_RESOURCE
)
)
public void myMethod() {
}

注意,在这个例子中,MySubAnnotation有一个空的目标列表,即@Target({}),它只允许它作为其他注释中的值。当然,您可以添加其他允许的目标。这不会影响它作为"子注释"的使用,因为这总是允许的。

但是在这里将注释部分设计为子注释并没有多大优势。你所得到的只是需要更多的打字。一个可以想象的可能性是在这里提供一个默认值,例如

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
EntityType entityType();
MySubAnnotation mySubAnnotation() default
@MySubAnnotation(actionType=ActionType.UPDATE, resourceType=Resource.MY_RESOURCE);
}

与仅为actionTyperesourceType指定默认值的区别在于,现在,开发人员可以使用MySubAnnotation的默认值,即两个值,或者必须为两个值指定显式值,他们不能只覆盖其中一个。

最新更新