Java 批注的允许的属性类型刻意非常严格,但是允许的类型也可以使用一些简洁的复合批注类型。
考虑教程站点中的示例注释:
package annotation;
@interface ClassPreamble {
String author();
String[] reviewers();
}
在这里,作者和审阅者具有String和array类型,这与允许的批注属性类型保持一致。 以下是允许的类型的完整列表(从Java 7开始):
- 串
- 类
- 任何对Class的参数化调用
- 枚举类型
- 注释类型,请注意不允许循环,带注释的类型不能引用自身
- 一个数组类型,其元素类型为上述类型之一。
现在,要使功能更丰富的ClassPreable,请考虑以这种方式定义的另外两种注释类型:
package annotation;
public @interface Author {
String first() default '';
String last() default '';
}
package annotation;
public @interface Reviewer {
String first() default '';
String last() default '';
}
有了这些,ClassPreamble可以由更丰富的Author和Reviewer批注类型组成,方法是:
package annotation;
@interface ClassPreamble {
Author author();
Reviewer[] reviewers();
}
现在,应用于类的注释如下所示:
package annotation;
@ClassPreamble(author = @Author(first = 'John', last = 'Doe')
, reviewers = {@Reviewer(first = 'first1', last = 'last1'), @Reviewer(last = 'last2') }
)
public class MyClass {
....
}
这是一个人为设计的示例,仅用于演示注释的组成,但是该方法广泛用于现实世界中的注释,例如,用于定义两个JPA实体之间的多对多关系:
@ManyToMany
@JoinTable(name='Employee_Project',
joinColumns=@JoinColumn(name='Employee_ID'),
inverseJoinColumns=@JoinColumn(name='Project_ID'))
private Collection<Project> projects;
参考:在all和其他博客上撰写我们JCG合作伙伴 Biju Kunjummen的Java注释 。
翻译自: https://www.javacodegeeks.com/2012/12/composing-java-annotations.html