我是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);
}
与仅为actionType
和resourceType
指定默认值的区别在于,现在,开发人员可以使用MySubAnnotation
的默认值,即两个值,或者必须为两个值指定显式值,他们不能只覆盖其中一个。