Java-аннотации позволяют нам добавлять информацию метаданных в наш исходный код, хотя они не являются частью самой программы. Аннотации были добавлены в java из JDK 5. Аннотации не оказывают прямого влияния на работу кода, который они аннотируют (т.е. это не влияет на выполнение программы).
В этом руководстве мы рассмотрим следующие темы: использование аннотаций, как применять аннотации, какие предопределенные типы аннотаций доступны в Java и как создавать собственные аннотации.
Какая польза от аннотаций?
1) Инструкции для компилятора : в Java доступны три встроенные аннотации ( @Deprecated
, @Override
@SuppressWarnings
), которые можно использовать для предоставления определенных инструкций компилятору. Например, аннотация @override используется для указания компилятору, что аннотированный метод переопределяет метод. Подробнее об этих встроенных аннотациях с примером обсуждается в следующих разделах этой статьи.
2) Инструкторы во время компиляции : аннотации могут предоставлять компилятору инструкции во время компиляции, которые могут в дальнейшем использоваться инструментами сборки программного обеспечения для генерации кода, файлов XML и т. Д.
3) Инструкции во время выполнения : мы можем определить аннотации, которые будут доступны во время выполнения, к которым мы можем получить доступ, используя java-отражение, и которые могут быть использованы для предоставления инструкций программе во время выполнения. Мы обсудим это с помощью примера, позже в этом же посте.
Основы аннотаций
Аннотация всегда начинается с символа @
за которым следует имя примечания. Символ @
указывает компилятору, что это аннотация.
Например, @Override
Здесь символ @ означает, что это аннотация, а Override - название этой аннотации.
Где мы можем использовать аннотации?
Аннотации могут применяться к классам, интерфейсам, методам и полям. Например, приведенная ниже аннотация применяется к методу.
@Override void myMethod () { //Сделай что-нибудь }
Что именно делает эта аннотация здесь, объясняется в следующем разделе, но для краткости инструктируем компилятору, что myMethod()
- это метод переопределения, который переопределяет метод (myMethod ()) суперкласса.
Встроенные аннотации в Java
Java имеет три встроенные аннотации:
- @Override
- @Deprecated
- @SuppressWarnings
1) @Override:
При переопределении метода в дочернем классе, мы должны использовать эту аннотацию, чтобы пометить этот метод. Это делает код читабельным и позволяет избежать проблем с обслуживанием, таких как: при изменении сигнатуры метода родительского класса вы должны изменить сигнатуру в дочерних классах (где используется эта аннотация), иначе компилятор выдаст ошибку компиляции. Это трудно отследить, если вы не использовали эту аннотацию.
Пример:
открытый класс MyParentClass { public void justaMethod () { System.out.println («Метод родительского класса»); } } открытый класс MyChildClass extends MyParentClass { @Override public void justaMethod () { System.out.println («Метод дочернего класса»); } }
Я считаю, что пример говорит само за себя. Чтобы узнать больше об этой аннотации, обратитесь к этой статье: @Override встроенная аннотация .
2) @ устарел
@Deprecated аннотация указывает, что отмеченный элемент (класс, метод или поле) устарел и больше не должен использоваться. Компилятор генерирует предупреждение всякий раз, когда программа использует метод, класс или поле, которые уже помечены аннотацией @Deprecated. Если элемент устарел, его также следует задокументировать с помощью тега Javadoc @deprecated, как показано в следующем примере. Запишите разницу в регистре с помощью @Deprecated и @deprecated. @deprecated используется для документирования.
Пример:
/ ** * @ устарел * причина, по которой это устарело * / @Deprecated public void anyMethodHere () { // Сделай что-нибудь }
Теперь, когда любая программа будет использовать этот метод, компилятор выдаст предупреждение. Чтобы узнать больше об этой аннотации, обратитесь к этой статье: Java - аннотация @Deprecated .
3) @SuppressWarnings
Эта аннотация указывает компилятору игнорировать определенные предупреждения. Например, в приведенном ниже коде я вызываю устаревший метод (давайте предположим, что метод deprecatedMethod () помечен аннотацией @Deprecated), поэтому компилятор должен сгенерировать предупреждение, однако я использую аннотацию @@ SuppressWarnings, которая подавляет эту устаревание предупреждение.
@SuppressWarnings ( "устаревание") void myMethod () { myObject.deprecatedMethod (); }
Создание пользовательских аннотаций
- Аннотации создаются с использованием @interface, за которым следует имя аннотации, как показано в примере ниже.
- Аннотация также может иметь элементы. Они похожи на методы. Например, в приведенном ниже коде у нас есть четыре элемента. Мы не должны обеспечивать реализацию этих элементов.
- Все аннотации расширяют интерфейс java.>
импорт java.>Примечание. Все элементы, для которых установлены значения по умолчанию при создании аннотаций, могут быть пропущены при использовании аннотаций. Например, если я применяю приведенную выше аннотацию к классу, я бы сделал это так:
@MyCustomAnnotation ( studentName = "Чайтаньи", stuAddress = "Агра, Индия" ) открытый класс MyClass { ... }Как вы можете видеть, мы не дали никакого значения элементам
stuStream
иstuStream
как необязательно устанавливать значения этих элементов (значения по умолчанию уже были установлены в определении аннотации, но если вы хотите, вы можете назначить новое значение при использовании аннотации точно так же, как мы это делали для других элементов). Однако мы должны предоставить значения других элементов (элементов, для которых не установлены значения по умолчанию) при использовании аннотации.Примечание : мы также можем иметь элементы массива в аннотации. Вот как мы можем их использовать:
Определение аннотации:@interface MyCustomAnnotation { int count (); String [] books (); }Использование:
@MyCustomAnnotation ( кол = 3, books = {"C ++", "Java"} ) открытый класс MyClass { }Вернемся к теме снова: в примере с пользовательскими аннотациями мы использовали следующие четыре аннотации:
@Documented
,@Target
,@Inherited
@Retention
. Давайте обсудим их подробно.@Documented
@Documented annotation указывает, что элементы, использующие эту аннотацию, должны быть документированы JavaDoc. Например:
java.>@MyCustomAnnotation открытый класс MyClass { // Тело класса }При создании javadoc для класса
MyClass
, аннотация@MyCustomAnnotation
будет включена в это.@Target
Он указывает, где мы можем использовать аннотацию. Например: в приведенном ниже коде мы определили целевой тип как МЕТОД, что означает, что приведенная ниже аннотация может использоваться только для методов.
import java.>открытый класс MyClass {@MyCustomAnnotationpublic void myMethod (){//Делать что-то} }Примечание : 1) Если вы не определили тип цели, это означает, что аннотация может быть применена к любому элементу.
2) Помимо ElementType.METHOD, аннотация может иметь следующие возможные целевые значения.
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.FIELD@Inherited
Аннотация @Inherited указывает на то, что пользовательская аннотация, используемая в классе, должна быть унаследована всеми его подклассами. Например:
java.>@MyCustomAnnotation открытый класс MyParentClass {... }открытый класс MyChildClass extends MyParentClass { ... }Здесь класс
MyParentClass
использует аннотацию@MyCustomAnnotation
которая помечена аннотацией @inherited. Это означает, что подклассMyChildClass
наследует@MyCustomAnnotation
.@Retention
Это указывает, как долго аннотации с аннотированным типом должны быть сохранены.
импорт java.>Здесь мы использовали RetentionPolicy.RUNTIME. Есть и два других варианта. Давайте посмотрим, что они означают:
RetentionPolicy.RUNTIME
: аннотация должна быть доступна во время выполнения для проверки с помощью java-отражения.
RetentionPolicy.CLASS
: аннотация будет в файле .class, но она не будет доступна во время выполнения.
RetentionPolicy.SOURCE
: аннотация будет доступна в исходном коде программы, она не будет ни в файле .class, ни будет доступна во время выполнения.Вот и все для этой темы «Аннотация Java». Если у вас есть какие-либо вопросы, не стесняйтесь написать ниже.
ясно и кратко
Красиво написано ... спасибо!
Поправьте меня, если я ошибаюсь, поскольку цель настроена на метод:
@Target (ElementType.METHOD)
Это не скомпилировать:
@MyCustomAnnotation (
studentName =»Чайтаньи»,
stuAddress = ”Агра, Индия”
)
открытый класс MyClass {…}
Привет Тахир,
Вы должны определить аннотацию как @Target (ElementType.METHOD)
Таким образом, вы не можете использовать это для класса, это использовать только для любого метода.
классно…. хорошо объяснил… большое спасибо
Отличное введение. Кратко и точно. Спасибо!
Здравствуй,
У меня есть вопрос, можно ли аннотировать переменные экземпляра или блок перехвата Try или нет?