Какой смысл в аннотациях пакетов? - PullRequest
38 голосов
/ 20 января 2010

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

Почему вы хотите связать метаданные с пакетом? Какие вещи вы могли бы сделать?

Ответы [ 6 ]

41 голосов
/ 17 марта 2011
  1. bnd tool (и maven-bundle-plugin) использует аннотации пакетов. Размещение @ Version и аннотации @Export в package-info.java позволяет генерировать метаданные OSGi.
  2. javadoc использует аннотации пакетов.
  3. JAXB использует аннотации на уровне пакета, , например, , чтобы указать отображение типа Java на тип схемы XML для всего пакета. Аннотации пакетов также используются в XML-привязке JBoss.
  4. Плагин Struts 2 Convention использует аннотацию для указания перехватчика по умолчанию для всех действий в пакете.
  5. Существуют некоторые пакеты уровня Hibernate Аннотации . Пример использования этих аннотаций можно найти здесь .
7 голосов
/ 20 января 2010

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

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

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

4 голосов
/ 20 января 2010

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

  • Аннотирование специальных пакетов, позволяющих некоторым аспектам (например, использование AspectJ) ткать в них классы для определенной функциональности.некоторые пакеты, которые должны быть прочитаны некоторыми инструментами, например, для источника, метаданных или других видов генерации ресурсов.
2 голосов
/ 17 марта 2011
Например,

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

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

1 голос
/ 17 марта 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 здесь.)

0 голосов
/ 01 августа 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...