Аннотации Java

Какова цель аннотаций в Java? У меня есть эта нечеткая идея о них, как где-то между комментарием и фактическим кодом. Они влияют на программу во время выполнения?

Каковы их типичные обычаи?

Являются ли они уникальными для Java? Есть ли эквивалент С++?

Ответ 1

Аннотации в основном используются кодом, который проверяет другой код. Они часто используются для изменения (то есть украшения или обертывания) существующих классов во время выполнения, чтобы изменить их поведение. Рамки, такие как JUnit и Hibernate использовать аннотации чтобы свести к минимуму количество кода, который вам нужно написать для использования фреймворков.

Oracle имеет хорошее объяснение концепции и ее значение в Java на своем сайте.

Ответ 2

Кроме того, являются ли они уникальными для Java, существует ли эквивалент С++?

Нет, но VB и С# имеют attributes, которые являются тем же самым.

Их использование весьма разнообразно. Один типичный пример Java @Override не влияет на код, но может быть использован компилятором для генерации предупреждения (или ошибки), если декорированный метод фактически не переопределяет другой метод. Аналогично, методы могут быть помечены как устаревшие.

Тогда есть отражение. Когда вы отражаете тип класса в своем коде, вы можете получить доступ к атрибутам и действовать в соответствии с найденной там информацией. Я не знаю примеров на Java, но в .NET это используется компилятором для генерации (de) сериализации для классов, определения макет памяти структур и объявить импорт функций из старых библиотек ( среди прочего). Они также контролируют работу дизайнера форм IDE.

/EDIT: Атрибуты на классах сопоставимы с интерфейсами тегов (например, Serializable в Java). Однако в рекомендациях по кодированию .NET говорится, что не использовать интерфейсы тегов. Кроме того, они работают только на уровне класса, а не на уровне метода.

Ответ 3

Андерс дает хорошее резюме, и вот пример аннотации JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Здесь аннотация @Test сообщает JUnit, что метод flatfileMissing является тестом, который должен быть выполнен, и ожидаемым результатом является бросок IOException. Таким образом, когда вы запускаете свои тесты, этот метод будет вызываться, и тест пройдет или завершится с ошибкой, исходя из того, выбрано ли IOException.

Ответ 4

В Java также есть инструмент обработки аннотаций (apt), где вы не только создаете аннотации, но и решаете, как эти аннотации работают с исходным кодом.

Здесь - введение.

Ответ 5

Чтобы увидеть некоторые интересные вещи, которые вы можете сделать с помощью аннотаций, просмотрите мои аннотации и обработчик аннотаций JavaBean.

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

Ответ 6

По буквальному определению аннотация добавляет примечания к элементу. Аналогично, аннотации Java - это теги, которые мы вставляем в исходный код для предоставления дополнительной информации о коде. Аннотации Java связывают информацию с элементом аннотированной программы. Помимо аннотаций Java Java-программы содержат множество неофициальных документов, которые обычно содержатся в комментариях в файле исходного кода. Но аннотации Java отличаются от комментариев, которые они аннотируют элементы программы напрямую, используя типы аннотаций, чтобы описать форму аннотаций. Аннотации Java представляют информацию стандартным и структурированным способом, чтобы ее можно было легко использовать с помощью инструментов обработки.

Для более детального изучения есть хороший учебник по Аннотации Java

Ответ 8

Аннотации, когда дело доходит до EJB, известны как выбор неявного подхода среднего уровня по явному среднему подходу, когда вы используете аннотацию, которую вы настраиваете, что вам нужно именно от API например, вам необходимо вызвать метод транзакции для банковского перевода: без использования аннотации: код будет

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

при использовании аннотации ваш код не содержит громоздких вызовов API, услуги. Код чист и ориентирован на бизнес-логику

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}

Ответ 9

Аннотации, форма метаданных, предоставляют данные о программе, которая не является частью самой программы. Аннотации не оказывают прямого влияния на работу кода, который они аннотируют.

Аннотации имеют ряд применений, среди них:

  • Информация для компилятора - аннотации могут использоваться компилятором для обнаружения ошибок или подавления предупреждений.
  • Обработка во время компиляции и во время развертывания - программные инструменты могут обрабатывать информацию аннотаций для генерации кода, файлов XML и т.д.
  • Обработка во время выполнения. Некоторые аннотации доступны для изучения во время выполнения.

Область видимости определяется константами java.lang.annotation.RetentionPolicy SOURCE, CLASS и RUNTIME

  • RetentionPolicy.SOURCE: аннотация будет доступна в исходном коде программы и может использоваться компилятором или apt для генерации кода.
  • RetentionPolicy.CLASS: аннотация будет в файле .class, но она не будет доступна во время выполнения. Используемые инструменты манипулирования байтовым кодом, такие как ASM, выполняют модификации
  • RetentionPolicy.RUNTIME: аннотация будет доступна в файле .class и во время выполнения для проверки с помощью java-отражения через getAnnotations().