Разрешенные типы атрибутов аннотаций Java преднамеренно очень ограничены, однако с разрешенными типами возможны некоторые чистые составные типы аннотаций.
Рассмотрим примерную аннотацию с учебного сайта:
|
1
2
3
4
5
|
package annotation;@interface ClassPreamble { String author(); String[] reviewers();} |
Здесь автор и рецензенты относятся к типу String и массиву, что соответствует разрешенным типам атрибутов аннотации. Ниже приведен полный список разрешенных типов (начиная с Java 7):
- строка
- Учебный класс
- любой параметризованный вызов класса
- тип enum
- тип аннотации, обратите внимание, что циклы не допускаются, аннотированный тип не может ссылаться на себя
- тип массива, тип элемента которого является одним из предыдущих типов.
Теперь, чтобы сделать более богатым ClassPreable, рассмотрим еще два типа аннотаций, определенных следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
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 следующим образом:
|
1
2
3
4
5
|
package annotation;@interface ClassPreamble { Author author(); Reviewer[] reviewers();} |
Теперь аннотация, примененная к классу, выглядит следующим образом:
|
1
2
3
4
5
6
7
8
|
package annotation;@ClassPreamble(author = @Author(first = 'John', last = 'Doe') , reviewers = {@Reviewer(first = 'first1', last = 'last1'), @Reviewer(last = 'last2') })public class MyClass {....} |
Это надуманный пример только для демонстрации композиции аннотаций, однако этот подход широко используется для аннотаций реального мира, например, для определения отношения многих ко многим между двумя сущностями JPA:
|
1
2
3
4
5
|
@ManyToMany@JoinTable(name='Employee_Project', joinColumns=@JoinColumn(name='Employee_ID'), inverseJoinColumns=@JoinColumn(name='Project_ID'))private Collection<Project> projects; |
Ссылка: Составление аннотаций на Java от нашего партнера по JCG Биджу Кунджуммена в блоге all and sundry.