Чтобы глубже изучить аннотации, мы должны иметь возможность определять наши собственные аннотации и использовать их. Прежде чем определять наши собственные аннотации, мы должны понять синтаксис метааннотаций и связанных с ними аннотаций определений, предоставляемых Java.
-------------------------------------------------- ----------------------------------
Мета-аннотация:
Роль метааннотаций заключается в аннотировании других аннотаций. Java5.0 определяет четыре стандартных типа метааннотаций, которые используются для описания других типов аннотаций. Мета-аннотации, определенные Java5.0:
1.@Цель,
2.@Удержание,
3.@Документировано,
4.@Унаследовано
Эти типы и поддерживаемые ими классы находятся в пакете java.lang.annotation. Давайте рассмотрим роль каждой метааннотации и инструкции по использованию соответствующих подпараметров.
-------------------------------------------------- ----------------------------------
@Цель:
@Target объясняет область действия объектов, измененных с помощью аннотации: аннотацию можно использовать для пакетов, типов (классов, интерфейсов, перечислений, типов аннотаций), членов типов (методов, конструкторов, переменных-членов, значений перечисления), параметров метода и локальных переменных ( такие как переменные цикла, параметры catch). Использование цели в объявлении типа аннотации может сделать измененную цель более понятной.
Функция: используется для описания области использования аннотаций (т. е.: где можно использовать описанные аннотации).
Значения (ElementType):
1.CONSTRUCTOR: используется для описания конструктора 2.FIELD: используется для описания домена 3.LOCAL_VARIABLE: используется для описания локальных переменных 4.METHOD: используется для описания метода 5.PACKAGE: используется для описания пакета 6.PARAMETER: используется для описания параметров 7.TYPE: используется для описания классов, интерфейсов (включая типы аннотаций) или объявлений перечислений.
Примеры использования:
@Target(ТипЭлемента.ПОЛЕ)
общественный @interface NoDBColumn {
}
-------------------------------------------------- ----------------------------------
@Удержание:
@Retention определяет продолжительность хранения аннотации: некоторые аннотации появляются только в исходном коде и отбрасываются компилятором, в то время как другие аннотации, скомпилированные в файле класса, могут быть виртуализированы. Машина их игнорирует; а другие будут читаться при загрузке класса (обратите внимание, что это не влияет на выполнение класса, т.к. аннотация и класс используются отдельно). Используйте эту мета-аннотацию, чтобы ограничить «жизненный цикл» аннотации.
Функция: указывает, на каком уровне необходимо сохранить информацию аннотации, и используется для описания жизненного цикла аннотации (т. е.: в какой области действия описанная аннотация действительна).
Значения (RetentionPoicy):
1.ИСТОЧНИК: действителен в исходном файле (т. е. исходный файл сохраняется).
2.CLASS: действителен в файлах классов (т. е. зарезервирован для классов).
3.RUNTIME: действителен во время выполнения (то есть сохраняется во время выполнения).
Тип метааннотации Retention имеет уникальное значение как член, и его значение берется из значения типа перечисления java.lang.annotation.RetentionPolicy. Конкретные примеры заключаются в следующем:
-------------------------------------------------- ----------------------------------
@Документировано:
@Documented используется для описания других типов аннотаций, которые должны использоваться в качестве общедоступного API аннотированных участников программы и, следовательно, могут быть документированы с помощью таких инструментов, как javadoc. Documented — это аннотация разметки, не имеющая членов.
Метааннотация @Inherited — это аннотация разметки @Inherited, указывающая, что определенный тип аннотации наследуется. Если для класса используется тип аннотации, измененный с помощью @Inherited, эта аннотация будет использоваться для подклассов этого класса.
Примечание. Типы аннотаций @Inherited наследуются подклассами аннотированного класса. Класс не наследует аннотацию от интерфейса, который он реализует, а метод не наследует аннотацию от метода, который он перегружает.
Если сохранение аннотации, аннотированной типом аннотации @Inherited, равно RetentionPolicy.RUNTIME, API отражения расширяет это наследование. Если мы используем java.lang.reflect для запроса аннотации типа аннотации @Inherited, начнет работать рефлексивная проверка кода: проверка класса и его родительского класса до тех пор, пока не будет найден указанный тип аннотации или верхний уровень структуры наследования класса. достигается.
Пример кода:
-------------------------------------------------- ----------------------------------
Пользовательская аннотация:
При использовании @interface для настройки аннотаций интерфейс java.lang.annotation.Annotation автоматически наследуется, а другие детали автоматически дополняются компилятором. При определении аннотаций вы не можете наследовать другие аннотации или интерфейсы. @interface используется для объявления аннотации, и каждый метод фактически объявляет параметр конфигурации. Имя метода — это имя параметра, а тип возвращаемого значения — это тип параметра (тип возвращаемого значения может быть только базовым типом: класс, строка или перечисление). Вы можете объявить значение параметра по умолчанию через default.
Определите формат аннотации:
имя публичной аннотации @interface {тело определения}
Поддерживаемые типы данных параметров аннотации:
1. Все основные типы данных (int, float, boolean, byte, double, char, long, short)
2. Строковый тип 3. Тип класса 4. Тип Enum 5. Тип аннотации 6. Массивы всех вышеперечисленных типов
Как установить параметры в Типе аннотации:
Во-первых, его можно изменить только с двумя правами доступа: общедоступным или по умолчанию. Например, здесь методу присвоен тип по умолчанию;
Во-вторых, члены параметров могут использовать только восемь основных типов данных: byte, short, char, int, long, float, double, boolean, а также типы данных, такие как String, Enum, Class, аннотации и массивы этих типов. String value();Здесь параметром является String;
В-третьих, если имеется только один элемент параметра, лучше всего задать для имени параметра значение «значение», за которым следуют круглые скобки. Пример: аннотация FruitName в следующем примере имеет только один элемент параметра.
Простые пользовательские аннотации и примеры использования аннотаций:
импортировать java.lang.annotation.Documented;
импортировать java.lang.annotation.ElementType;
импортировать java.lang.annotation.Retention;
импортировать java.lang.annotation.RetentionPolicy;
импортировать java.lang.annotation.Target;
/**
* Примечания к названиям фруктов.
* @author Пейда
*
*/
@Target(ТипЭлемента.ПОЛЕ)
@Retention(RetentionPolicy.RUNTIME)
@Документировано
общественный @interface FruitName {
Строковое значение() по умолчанию "";
}
импортировать java.lang.annotation.Documented;
импортировать java.lang.annotation.ElementType;
импортировать java.lang.annotation.Retention;
импортировать java.lang.annotation.RetentionPolicy;
импортировать java.lang.annotation.Target;
/**
* Аннотация цвета фруктов
* @author Пейда
*
*/
@Target(ТипЭлемента.ПОЛЕ)
@Retention(RetentionPolicy.RUNTIME)
@Документировано
общественный @interface FruitColor {
/**
* Перечисление цветов
* @author Пейда
*
*/
общедоступное перечисление Color {BULE,RED,GREEN};
/**
* Цветовые атрибуты
* @возвращаться
*/
Цвет FruitColor() по умолчанию Color.GREEN;
}
импортировать аннотацию.FruitColor.Color;
общественный класс Apple {
@FruitName("Яблоко")
частная строка appleName;
@FruitColor(fruitColor=Color.RED)
частная строка appleColor;
public void setAppleColor (String appleColor) {
this.appleColor = appleColor;
}
публичная строка getAppleColor() {
вернуть цвет яблока;
}
public void setAppleName(String appleName) {
this.appleName = appleName;
}
публичная строка getAppleName() {
вернуть имя яблока;
}
общественный недействительный displayName () {
System.out.println("Название фрукта: Яблоко");
}
}