Статьи

Составление аннотаций Java

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