В каких основных областях мы можем использовать аннотации? Является ли эта функция заменой для конфигурации на основе XML?
Как и где используются аннотации, используемые в Java?
Ответ 1
Аннотации - мета-мета-объекты, которые могут использоваться для описания других метаобъектов. Мета-объекты - это классы, поля и методы. Запрос объекта на его метаобъект (например, anObj.getClass()
) называется интроспекцией. Интроспекция может идти дальше, и мы можем спросить метаобъект, каковы его аннотации (например, aClass.getAnnotations
). Интроспекция и аннотации относятся к так называемому отражению и метапрограммированию.
Аннотации необходимо интерпретировать так или иначе, чтобы быть полезными. Аннотации могут быть интерпретированы во время разработки IDE или компилятором или во время выполнения с помощью фреймворка.
Обработка аннотаций является очень мощным механизмом и может использоваться по-разному:
- для описания ограничений или использования элемента: например.
@Deprecated, @Override
, или@NotNull
- для описания "природы" элемента, например.
@Entity, @TestCase, @WebService
- для описания поведения элемента:
@Statefull, @Transaction
- чтобы описать процесс обработки элемента:
@Column, @XmlElement
Во всех случаях аннотация используется для описания элемента и уточнения его значения.
До JDK5 информация, которая теперь выражается аннотациями, должна храниться где-то в другом месте, а файлы XML часто использовались. Но удобнее использовать аннотации, потому что они будут принадлежать самому Java-коду и, следовательно, гораздо легче манипулировать, чем XML.
Использование аннотаций:
- Документация, например. XDoclet
- Подборка
- IDE
- Структура тестирования, например. JUnit
- контейнер IoC, например. как Spring
- Сериализация, например. XML
- Аспектно-ориентированное программирование (АОП), например. Spring АОП
- Серверы приложений, например. Контейнер EJB, веб-сервис
- Объектно-реляционное сопоставление (ORM), например. Hibernate, JPA
- и многое другое...
... обратите внимание, например, на проект Lombok, который использует аннотации, чтобы определить, как сгенерировать equals
или hashCode
.
Ответ 2
Есть несколько приложений для аннотаций Java. Прежде всего, они могут использоваться компилятором (или расширениями компилятора). Рассмотрим, например, аннотацию Override:
class Foo {
@Override public boolean equals(Object other) {
return ...;
}
}
Этот фактически встроен в Java JDK. Компилятор будет сигнализировать об ошибке, если какой-либо метод помечен им, что делает не переопределять метод, унаследованный от базового класса. Эта аннотация может быть полезна, чтобы избежать общей ошибки, когда вы на самом деле намерены переопределить метод, но не можете этого сделать, поскольку подпись, указанная в вашем методе, не соответствует сигнатуре переопределенного метода:
class Foo {
@Override public boolean equals(Foo other) { // Compiler signals an error for this one
return ...;
}
}
Предстоящий JDK7 позволит аннотации любого типа. Уже есть предложения по использованию этой функции для комментариев компилятора, таких как NotNull, например:
public void processSomething(@NotNull String text) {
...
}
который может позволить компилятору предупредить вас о неправильном/непроверенном использовании переменных и нулевых значений.
Еще одно расширенное приложение для аннотаций включает обработку отражения и аннотации во время выполнения. Это (я думаю), что вы имели в виду, когда говорите об аннотации как "замена для конфигурации на основе XML". Это вид обработки аннотаций, используемый, например, различными фреймворками и стандартами JCP (постоянство, вложение зависимостей, вы называете его), чтобы предоставить необходимые метаданные и информацию о конфигурации.
Ответ 3
Аннотации - это форма метаданных (данные о данных), добавленные в исходный файл Java. Они в основном используются фреймворками для упрощения интеграции клиентского кода. Несколько реальных примеров верха:
-
JUnit 4 - вы добавляете аннотацию
@Test
к каждому методу тестирования, который должен выполнять бегун JUnit. Также есть дополнительные аннотации к настройке тестирования (например,@Before
и@BeforeClass
). Все они обрабатываются бегуном JUnit, который выполняет тесты соответственно. Вы могли бы сказать, что это замена для XML-конфигурации, но иногда аннотации более мощные (например, они могут использовать отражение), а также они ближе к коду, к которому они ссылаются (аннотация@Text
находится прямо перед методом тестирования, поэтому цель этого метода понятна - также служит документацией). Конфигурация XML, с другой стороны, может быть более сложной и может включать гораздо больше данных, чем аннотации. -
Terracotta - использует как аннотации, так и файлы конфигурации XML. Например, аннотация
@Root
сообщает Terraotta runtime, что аннотированное поле является корнем, а его память должна совместно использоваться экземплярами VM. Файл конфигурации XML используется для настройки сервера и указания его классам на инструмент. -
Google Guice - пример будет аннотацией
@Inject
, которая при применении к конструктору заставит Guice runtime искать значения для каждого параметра на основе определенных форсунок. Аннотацию@Inject
было бы довольно сложно реплицировать с использованием файлов конфигурации XML, и ее близость к конструктору, на который он ссылается, весьма полезна (представьте, что вам нужно искать в огромный XML файл, чтобы найти все установленные вами инъекции зависимостей).
Надеюсь, я дал вам представление о том, как аннотации используются в разных рамках.
Ответ 4
Аннотации в Java обеспечивают среднее значение для описания классов, полей и методов. По сути, они представляют собой форму метаданных, добавленных в исходный файл Java, они не могут напрямую влиять на семантику программы. Тем не менее, аннотации могут быть прочитаны во время выполнения с использованием Reflection, и этот процесс известен как Introspection. Затем он может использоваться для изменения классов, полей или методов.
Эта функция часто используется библиотеками и SDK (hibernate, JUnit, Spring Framework), чтобы упростить или уменьшить объем кода, который программист мог бы, если бы не выполнял работу с этими библиотеками или SDK. Поэтому справедливо сказать, что аннотации и размышления работают рука об руку на Java.
Мы также можем ограничить доступность аннотации либо времени компиляции, либо времени выполнения. Ниже приведен простой пример создания пользовательской аннотации
Driver.java
package io.hamzeen;
import java.lang.annotation.Annotation;
public class Driver {
public static void main(String[] args) {
Class<TestAlpha> obj = TestAlpha.class;
if (obj.isAnnotationPresent(IssueInfo.class)) {
Annotation annotation = obj.getAnnotation(IssueInfo.class);
IssueInfo testerInfo = (IssueInfo) annotation;
System.out.printf("%nType: %s", testerInfo.type());
System.out.printf("%nReporter: %s", testerInfo.reporter());
System.out.printf("%nCreated On: %s%n%n",
testerInfo.created());
}
}
}
TestAlpha.java
package io.hamzeen;
import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;
@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {
}
IssueInfo.java
package io.hamzeen;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author Hamzeen. H.
* @created 10/01/2015
*
* IssueInfo annotation definition
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {
public enum Type {
BUG, IMPROVEMENT, FEATURE
}
Type type() default Type.BUG;
String reporter() default "Vimesh";
String created() default "10/01/2015";
}
Ответ 5
Является ли это заменой для XML Конфигурация?
Не полностью, но совпадение, которое близко соответствует структурам кода (например, сопоставлениям JPA или инъекции зависимостей в Spring), часто может быть заменено аннотациями, а затем, как правило, гораздо менее подробным, раздражающим и болезненным. Практически все заметные структуры сделали этот переключатель, хотя старая конфигурация XML обычно остается в качестве опции.
Ответ 6
Есть 2 вида аннотаций
-
пользовательский вид, в большинстве случаев, аннотации работают как ярлык, сохраняют некоторые штрихи клавиш или делают вашу программу более удобочитаемой.
-
вид поставщика, представление обработчика в виде процессора представляет собой более легкий "интерфейс", ваша программа противостоит "ЧТО-ТО", но явно не "реализует" конкретный интерфейс (здесь также аннотация)
например. в jpa вы определяете что-то вроде
@Entity class Foo {...}
вместо
class Foo implements Entity {...}
оба говорят одно и то же: "Foo - это класс Entity"
Ответ 7
В таких структурах, как Hibernate, требуется множество конфигураций/сопоставлений, сильно использует аннотации.
Взгляните на Hibernate Annotations
Ответ 8
JPA (из Java EE 5) - отличный пример использования аннотаций. Java EE 6 также представит аннотации во множестве новых областей, таких как веб-службы RESTful и новые аннотации для каждого старого старого сервлет-API.
Вот несколько ресурсов:
- Sun - API сохранения Java
- Учебник по Java EE 5 - JPA
- Представляем платформу Java EE 6 (проверьте все три страницы).
Это не только специфические особенности конфигурации, которые могут быть/аннулированы аннотациями, но также могут использоваться для управления поведением. Вы видите это хорошо в примерах Java EE 6 JAX-RS.
Ответ 9
Где могут использоваться аннотации
Аннотации могут быть применены к объявлениям: объявления классов, полей, методов и других элементов программы. При использовании в декларации каждая аннотация часто появляется по соглашению в отдельной строке.
Java SE 8 Обновление: аннотации могут также применяться к использованию типов. Вот несколько примеров:
-
выражение создания экземпляра класса:
new @Interned MyObject();
-
Тип cast:
myString = (@NonNull String) str;
-
реализует предложение:
класс UnmodifiableList реализует @Readonly List < @Readonly T > {...}
-
Заявление об исключении исключений:
void monitorTemperature() бросает @Critical TemperatureException {...}
Ответ 10
Это полезно для аннотирования ваших классов, как на уровне метода, класса, так и на уровне поля, что-то об этом классе, которое не совсем связано с классом.
У вас могут быть свои собственные аннотации, которые используются для обозначения определенных классов только для тестирования. Это может быть просто для целей документирования, или вы можете применить его, отфильтровывая его во время компиляции кандидата на выпуск продукции.
Вы можете использовать аннотации для хранения некоторых метаданных, например, в структуре плагина, например, имя плагина.
Его просто еще один инструмент, у него много целей.
Ответ 11
Он придает дополнительную информацию о коде: (a) проверку компилятора или (b) анализ кода
**
- Ниже приведены встроенные аннотации:: 2 типа
**
Тип 1) Аннотации, применяемые к Java-коду:
@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj)
@Deprecated // indicates the deprecated method
Public doSomething()....
@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})
Тип 2) Аннотации, применяемые к другим аннотациям:
@Retention - Specifies how the marked annotation is stored—Whether in code only, compiled into the class, or available at run-time through reflection.
@Documented - Marks another annotation for inclusion in the documentation.
@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to
@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).
**
- Пользовательские аннотации::
** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations
ДЛЯ ЛУЧШЕ ПОНИМАНИЯ ПОПРОБУЙТЕ НИЖЕ ССЫЛКИ: ИЗБЕГАЙТЕ С ПРИМЕРАМИ
Ответ 12
Java EE 5 поддерживает использование аннотаций по конфигурации XML. Например, в EJB3 атрибуты транзакции по методу EJB задаются с помощью аннотаций. Они даже используют аннотации, чтобы пометить POJO как EJB и указать конкретные методы как методы жизненного цикла, а не требовать реализации интерфейса.
Ответ 13
Аннотации могут использоваться как альтернатива внешним файлам конфигурации, но не могут считаться полной заменой. Вы можете найти множество примеров, в которых annotationi использовались для замены файлов конфигурации, таких как Hibernate, JPA, EJB 3 и почти всех технологий, включенных в Java EE.
Во всяком случае, это не всегда хороший выбор. Цель использования файлов конфигурации обычно заключается в том, чтобы отделить код от деталей среды, в которой работает приложение. В таких ситуациях, и в большинстве случаев, когда конфигурация используется для сопоставления приложения со структурой внешней системы, аннотация не является хорошей заменой для файла конфигурации, поскольку они позволяют вам включать детали внешней системы в исходный код ваше приложение. Здесь внешние файлы должны считаться наилучшим выбором, иначе вам нужно будет изменить исходный код и перекомпилировать каждый раз, когда вы измените соответствующую деталь в среде исполнения.
Аннотации гораздо более подходят для украшения исходного кода дополнительной информацией, которая инструктирует инструменты обработки, как во время компиляции, так и во время выполнения, для обработки классов и структур классов особым образом. @Override
и JUnit @Test
являются хорошими примерами такого использования, которые подробно объясняются в других ответах.
В конечном итоге правило всегда одно и то же: храните внутри источника вещи, которые изменяются вместе с источником, и оставляйте вне источника вещи, которые меняются независимо от источника.
Ответ 14
Цель аннотации Java - просто связать информацию с аннотированным программным элементом. Аннотации Java могут использоваться как модификаторы в любом объявлении, будь то пакет, класс (включая перечисления), интерфейс (включая типы аннотаций), поле, метод, формальный параметр, конструктор или локальную переменную.
Аннотации Java также могут использоваться для констант перечисления. Такие аннотации помещаются непосредственно перед константой перечисления, которую они аннотируют. Аннотации Java обычно помещаются перед всеми другими модификаторами, но это не является обязательным требованием; они могут свободно перемешаться с другими модификаторами.
Подробнее читайте Аннотации Java.