Разрешенные типы атрибутов аннотаций 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.