Аннотации Java

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

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

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

С аннотациями можно творить ужасные вещи. Например, если вы знаете Spring Framework и их аннотацию @Transactional, которая запускает транзакцию до вызова метода и отката при исключении / ошибке и фиксируется при успешной транзакции. Он полностью поддерживает принцип SOC (разделение проблем). Очень чистый ! Правила Java! :-)

user1830397 16.11.2012 21:37

Мне кажется, это 3 вопроса. Вторая сама по себе слишком широка.

Raedwald 22.07.2013 13:50

Все аннотации по синтаксису выглядят как интерфейсы. Итак, как компилятор или JVM знает свое предназначение? Предположим, что если мы возьмем @ Override -> выполнит проверку того, правильно ли переопределен метод или нет, @ Transactional, как объяснено выше, выполняет операции, связанные с транзакциями. Где мы можем найти определение / логику всех этих аннотаций?

Paramesh Korrakuti 20.03.2015 14:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
117
3
33 493
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Also, are they unique to Java, is there a C++ equivalent?

Нет, но в VB и C# есть атрибуты, что одно и то же.

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

Когда вы используете аннотацию Java @Override и почему? Ссылка относится к вопросу о том, когда следует использовать аннотацию переопределения (@override). Это может помочь лучше понять концепцию аннотации.

Аннотации, когда дело доходит до 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
}

Другие вопросы по теме