1. Самая распространенная аннотация
•@Override: используется в методах, чтобы сообщить другим, что этот метод переопределяет родительский класс.
•@Устарело: другим не рекомендуется использовать старый API. Во время компиляции будет генерироваться предупреждающее сообщение, и его можно установить для всех элементов программы.
•@SuppressWarnings: временно отключить некоторые предупреждающие сообщения.
•@Entity: указывает, что этот класс является постоянным классом.
2. Создайте собственную аннотацию
Прежде чем говорить, прочтите код
1. Реализация аннотации только с одним параметром
Скопируйте код кода следующим образом:
пакет chb.test.annotation;
импортировать java.lang.annotation.Documented;
импортировать java.lang.annotation.ElementType;
импортировать java.lang.annotation.Retention;
импортировать java.lang.annotation.RetentionPolicy;
импортировать java.lang.annotation.Target;
@Target(ТипЭлемента.ТИП)
@Retention(RetentionPolicy.RUNTIME)
@Документировано
общественный @interface MyAnnotation1 {
Строковое значение();
}
2. Реализация аннотации с двумя параметрами
Скопируйте код кода следующим образом:
пакет chb.test.annotation;
импортировать java.lang.annotation.Documented;
импортировать java.lang.annotation.ElementType;
импортировать java.lang.annotation.Retention;
импортировать java.lang.annotation.RetentionPolicy;
импортировать java.lang.annotation.Target;
@Target(ТипЭлемента.МЕТОД)
@Retention(RetentionPolicy.RUNTIME)
@Документировано
общественный @interface MyAnnotation2 {
Описание строки();
логическое значение isAnnotation();
}
3. Экспериментальный класс аннотаций
Скопируйте код кода следующим образом:
пакет chb.test.annotation;
@MyAnnotation1("это аннотация1")
общественный класс AnnotationDemo {
@MyAnnotation2(description="это аннотация2",isAnnotation=true)
общественная недействительность SayHello () {
System.out.println("Привет, мир!");
}
}
4. Класс описания теста аннотации.
Скопируйте код кода следующим образом:
пакет chb.test.annotation;
импортировать java.lang.reflect.Method;
импортировать org.junit.Test;
общественный класс TestAnnotation {
@Тест
public void test() выдает ClassNotFoundException, SecurityException, NoSuchMethodException{
Class<?> cls = Class.forName("chb.test.annotation.AnnotationDemo");
логический флаг = cls.isAnnotationPresent(MyAnnotation1.class);
если (флаг) {
System.out.println("Считать класс аннотацией");
MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class);
System.out.println(annotation1.value());
}
Метод метод = cls.getMethod("sayHello");
флаг = метод.isAnnotationPresent(MyAnnotation2.class);
если (флаг) {
System.out.println("Метод оценки также является аннотацией");
MyAnnotation2 annotation2 = метод.getAnnotation(MyAnnotation2.class);
System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());
}
}
}
В результате эксперимента на консоль выведена следующая информация:
Определите, является ли класс аннотацией
это аннотация1
Метод суждения также является аннотацией
это аннотация2 правда
3. Введение и объяснение
1. @Target(ElementType.TYPE) в MyAnnotation1
ElementType в @Target используется для указания того, для каких элементов можно использовать тип аннотации. Например:
TYPE (тип), FIELD (атрибут), METHOD (метод), PARAMETER (параметр), CONSTRUCTOR (конструктор), LOCAL_VARIABLE (локальная переменная), PACKAGE (пакет), где TYPE (тип) относится к типу, который может использоваться в Типы классов, интерфейсов, перечислений и аннотаций.
2. @Retention(RetentionPolicy.RUNTIME) в MyAnnotation1
RetentionPolicy имеет три стратегии, а именно:
• ИСТОЧНИК: информация о типе аннотации будет сохранена только в исходном коде программы. Если исходный код скомпилирован, данные аннотации исчезнут и не будут сохранены в скомпилированном файле .class.
• CLASS: информация о типе аннотации сохраняется в исходном коде программы, а также в скомпилированном файле .class. Во время выполнения эта информация не загружается в JVM. Примечание. Стратегией по умолчанию является тип CLASS.
•ВРЕМЯ ВЫПОЛНЕНИЯ: указывает, что информация сохраняется в исходном коде и скомпилированных файлах .class и эта информация будет загружена в JVM во время выполнения.
3. @Документировано в MyAnnotation1
Цель состоит в том, чтобы отобразить эту информацию аннотации в документе JAVA API. Если @Documented не добавлен, соответствующая информация аннотации не будет отображаться в документе JAVA API.
4. @interface в MyAnnotation1
Ключевое слово, указывающее, что класс определен для аннотации.
5. Строковое значение() в MyAnnotation1;
Указывает, что существует параметр-член со значением имени и правом доступа в качестве модификатора по умолчанию. Обратите внимание на следующие два момента:
•Права доступа можно изменить только с помощью public и default (по умолчанию).
• Члены параметров могут использовать только восемь основных типов данных: byte, short, char, int, long, float, double, boolean, а также типы данных, такие как String, Enum, Class, аннотации и массивы этих типов.
6.@MyAnnotation1("это аннотация1") в AnnotationDemo
Поскольку MyAnnotation1 имеет только один параметр, вы можете написать значение непосредственно в круглых скобках. Примечание. Если аннотация имеет только один параметр, рекомендуется указать имя параметра как значение.
7.cls.isAnnotationPresent(MyAnnotation1.class) в TestAnnotation
Определите, использует ли класс аннотацию MyAnnotation1.
8. MyAnnotation1 в TestAnnotation annotation1 = cls.getAnnotation(MyAnnotation1.class)
Возвращает аннотацию этого класса для MyAnnotation1.
9. метод.isAnnotationPresent(MyAnnotation2.class) в TestAnnotation
Определите, использует ли метод аннотацию MyAnnotation2.