2008-08-23 3 views
104

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

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

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

+9

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

+1

Это выглядит как 3 вопроса для меня. Второй сам по себе слишком широк. – Raedwald

+0

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

ответ

74

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

У Oracle есть a good explanation of the concept and its meaning in Java на своем сайте.

16

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

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

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

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

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

12

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

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

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

7

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

Here введение.

4

Чтобы посмотреть некоторые интересные материалы, которые вы можете сделать с аннотациями, ознакомьтесь с my JavaBean annotations and annotation processor.

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

0

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

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

0

When do you use Java's @Override annotation and why? Ссылка относится к вопросу о том, когда следует использовать переопределения аннотацию (@Override) .. Это может помочь понять концепцию аннотация лучше. Проверьте.

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^