В чем смысл аннотаций к пакетам?

Я понимаю цель аннотаций классов благодаря Как и где используются аннотации на Java?. Какова цель аннотаций пакетов, как описано в этом сообщении блога и §7.4.1 спецификации языка Java?

Зачем вам нужно связывать метаданные с пакетом? Что бы вы могли делать?


person Gili    schedule 20.01.2010    source источник


Ответы (6)


  1. инструмент bnd (и maven-bundle-plugin ) использует аннотации пакетов. Помещение аннотаций @Version и @Export в package-info.java позволяет создавать метаданные OSGi.
  2. javadoc использует аннотации пакетов.
  3. JAXB использует аннотации на уровне пакета, например , чтобы указать отображение типа Java в тип схемы XML для всего пакета. Аннотации пакетов также используются в привязке JBoss xml.
  4. Плагин Struts 2 Convention использует аннотация, чтобы указать перехватчик по умолчанию для всех действий в пакете.
  5. Есть несколько аннотаций Hibernate на уровне пакета < / а>. Пример использования этих аннотаций можно найти здесь.
person Marat Salikhov    schedule 17.03.2011

Я полагаю, что @Deprecated имеет смысл. И, возможно, что-то вроде @Generated, если весь пакет был сгенерирован каким-то инструментом из источника, отличного от Java. Или @Internal, если этот пакет не является частью общедоступного API.

Возможно, инструменты OSGi (где вам нужно объявить версии ваших пакетов и пакеты, от которых вы зависите) тоже могут использовать это.

Кто-нибудь видел их в дикой природе?

person Thilo    schedule 20.01.2010

Две причины, о которых я могу думать:

  • Аннотирование специальных пакетов, чтобы позволить некоторым аспектам (например, с использованием AspectJ) вплетать классы в них для определенной функциональности.
  • Аннотирование некоторых пакетов, которые должны быть прочитаны некоторыми инструментами, например, для источника, метаданных или других видов генерации ресурсов.
person Amir Moghimi    schedule 20.01.2010
comment
Вы говорите, что аннотирование пакета эквивалентно аннотированию всех классов в этом пакете одним махом? - person Gili; 20.01.2010
comment
Нет, я имею в виду, что вы можете использовать его, чтобы указать, что все классы в этом пакете должны быть объединены. - person Amir Moghimi; 20.01.2010
comment
Чем это отличается от того, что я написал? - person Gili; 04.02.2010
comment
@Gili: Я понял, что ваш комментарий означает, что классы действительно имеют эту аннотацию сами на уровне языка. И я понял, что комментарий Амира означает, что обработчик аннотаций может видеть аннотацию в пакете (а не на классах как таковых), а затем на основании этого решить выполнить какое-либо действие с каждым классом в этом пакете. . Очень разные результаты при вызове Class.getAnnotations(). - person Andrzej Doyle; 17.03.2011
comment
@Andrzej: Вы правильно поняли мой комментарий. Ваш комментарий далее объясняет мой. - person Amir Moghimi; 24.06.2011

Например, JAXB позволяет большинство аннотаций, которые обычно используются для типа, чтобы также хорошо применяться к пакету. В этом случае смысл будет заключаться в том, чтобы указать значение по умолчанию для всех классов в этом пакете.

Например, если вы хотите, чтобы все свойства всех классов в пакете, предоставляемые через методы получения / установки, отображались в XML, вы можете указать @XmlAccessorType(XMLAccessType.PROPERTY) для каждого класса или просто указать его в пакете.

person Joachim Sauer    schedule 17.03.2011

Это не настоящая цель, но я использую их как обходной путь, чтобы избежать перекомпиляции файлов package-info.java.

Проблема в том, что javac (и задача Ant <javac>) не создает файл класса для package-info.java, если есть только документация (причина их существования) и оператор package bla;, и что задача ant перекомпилирует каждый файл, для которого нет соответствующего .class файла (или более старого).

Добавление туда фиктивной аннотации (например, SuppressWarnings) привело к созданию package-info.class и, таким образом, файл не перекомпилируется до тех пор, пока не будет изменен снова.

(Ant 1.8.0 решил эту проблему, создав пустой package-info.class, даже если аннотации не было, но здесь я использую более старую ant.)

person Paŭlo Ebermann    schedule 17.03.2011

Метаданные теста - это метаданные вокруг тестовых пакетов (модульные тесты или другие). Вы можете приписать различные части тестовых метаданных, которые подходят на уровне пакета, например: функции, владельцы, версии, ошибки / проблемы и т. Д. Они могут быть уточнены на уровне класса или метода, но иметь определения на уровне пакета или значения по умолчанию. может пригодиться для краткости. Я использовал вариант этого подхода (до использования аннотаций).

Аналогичный аргумент может быть приведен в отношении обобщенных метаданных кода относительно одних и тех же вещей: функций, прав собственности, дефектов, исторической информации и т. Д.

person Will    schedule 31.07.2013