Аннотации Java

114

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

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

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

Lehane
источник
9
С аннотациями можно творить ужасные вещи. Например, если вы знаете Spring Framework и их аннотацию @Transactional, которая запускает транзакцию до вызова метода и отката при исключении / ошибке и фиксируется при успешной транзакции. Он полностью поддерживает принцип SOC (разделение проблем). Очень чистый ! Правила Java! :-)
1
Мне кажется, это 3 вопроса. Вторая сама по себе слишком широка.
Raedwald
Все аннотации по синтаксису выглядят как интерфейсы. Итак, как компилятор или JVM знает свое предназначение? Предположим, что если мы возьмем @ Override -> выполнит проверку того, правильно ли переопределен метод или нет, @ Transactional, как объяснено выше, выполняет операции, связанные с транзакциями. Где мы можем найти определение / логику для всех этих аннотаций?
Paramesh Korrakuti

Ответы:

80

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

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

Андерс Сандвиг
источник
17

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

Нет, но VB и C # имеют одинаковые атрибуты .

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

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

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

Конрад Рудольф
источник
13

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

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

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

Эли Кортрайт
источник
7

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

Вот введение.

пекин
источник
4

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

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

Скотт Стэнчфилд
источник
1

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

Чтобы прочитать подробности, есть хороший учебник по Java Annotations.

Krishan
источник
0

Аннотации, когда дело доходит до 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
}
уборочная машина
источник