Аннотации Java — метаданные, классификация аннотаций, встроенные аннотации и пользовательские аннотации

Java

Привет всем, я Xiaole из Lebyte, я сказал это в прошлый раз6 особенностей полиморфизма Java | Le Byte, давайте посмотрим на аннотации в программировании на Java.

Аннотации Java имеют следующие знания:

  • метаданные
  • Классификация аннотаций
  • Встроенные аннотации
  • пользовательская аннотация
  • Процессор аннотаций
  • Servlet3.0

В этой статье сначала представлены первые четыре точки знаний: метаданные, классификация аннотаций, встроенные аннотации и пользовательские аннотации.


Введение в аннотации

Аннотации были представлены в Java 1.5 и широко использовались в различных средах Java, таких как Hibernate, Jersey,

Весна. Аннотации эквивалентны своего рода метаданным, встроенным в программу, которые можно анализировать с помощью инструментов анализа аннотаций или компиляторов.

Он анализируется, и вы также можете указать, что аннотация действительна во время компиляции или во время выполнения.


До рождения аннотаций метаданные программы существовали в виде аннотаций java или javadoc, но аннотации могут

Для большей функциональности он не только содержит метаданные, но и действует во время выполнения, парсеры аннотаций могут использовать разрешение doom.

процесс управления.


Аннотациязаключается в том, что Java предоставляет способ связать любую информацию и любые метаданные с элементом в метапрограмме.

(метаданные) подходы и методы. Аннотация — это интерфейс, программа может получить указанное через отражение

Объект Annotation программного элемента, а затем получить метаданные в аннотации через объект Annotation.

API аннотаций очень мощный и широко используется в различных средах Java, таких как Spring, Hibernate, JUnit.

2. Метаданные метаданных

Метаданные переводятся от слова метаданные, что означает «данные о данных», то есть структурная информация, описывающая данные. Существует множество функций метаданных, например: вы могли использовать комментарии Javadoc для автоматического создания документации. Это один тип функции метаданных. Как правило, метаданные можно использовать для создания документации, отслеживания зависимостей кода, проверки формата во время компиляции и замены существующих файлов конфигурации.

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

Его функция заключается в следующем:

① Создание документации: это самая распространенная и самая ранняя аннотация, предоставляемая java. Обычно используются @param @return и т.д.;

② Отслеживание зависимостей кода и реализация альтернативных функций файла конфигурации. Наиболее распространенной является конфигурация на основе аннотаций, начиная с версии Spring 2.5. Эффект заключается в уменьшении конфигурации. Текущая структура в основном использует эту конфигурацию, чтобы уменьшить количество файлов конфигурации. ;

③ Проверка формата выполняется во время компиляции. Если @override помещается перед методом, если ваш метод не переопределяет метод суперкласса, это можно проверить во время компиляции.

3. Классификация аннотаций

По количеству параметров аннотации:

1) Маркерная аннотация: тип аннотации без определения члена называется маркерной аннотацией.

2), аннотация с одним значением: только одно значение

3), полная аннотация: имеет несколько значений

Как применять и применять согласно аннотации:

1), встроенные системные аннотации JDK

2), метааннотация

3), пользовательская аннотация

4. Встроенные аннотации

В JavaSE встроены три стандартные аннотации, определенные в java.lang:

@Override

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

public interface Car {
	void run();
}
class QQ implements Car{
	@Override
	public void run() {}
}
class Bmw implements Car{
	@Override
	void run() {}
}


С компиляцией класса QQ проблем не будет, а класс BMW выдаст соответствующие ошибки при компиляции. исключен из родительского классаpublic abstractмодификатор. Аннотация @Override может использоваться только для методов, но не для других элементов программы.

@Deprecated

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

/**
 *  Deprecated -->该方法过时(有更好的解决方案)
 * @author Administrator
 */
public class TestDeprecated {
	@Deprecated
	public int test(){
		System.out.println("TestDeprecated.test()");
		return 0;
	}
	public void test(int a){
		System.out.println("TestDeprecated.test(int)");
	}
}

3. @SuppressWarnings

Подавлять предупреждения компилятора, эта аннотация только сообщает компилятору, что их игнорирование приводит к появлению специальных предупреждений. Например: использование примитивных типов в дженериках Java. Его политика хранения — SOURCE, которая будет отброшена компилятором.

/**
 * SuppressWarnings 压制警告
 * @author Administrator
 */
public class TestSuppressWarnings {
	public static void main(String[] args) {
		@SuppressWarnings("unused")
		List<String> list =new ArrayList<String>();
	}
	@SuppressWarnings("rawtypes") //没有定义范型
	public static List test(){
		return new ArrayList();
	}
}

5. Пользовательские аннотации

1. Простой вход

@interface:Используется для объявления аннотации. Каждый метод в аннотированном классе фактически объявляет параметр конфигурации. Имя метода — это имя параметра, а возвращаемый тип — это тип параметра. Значение параметра по умолчанию может быть объявлено по умолчанию.

@interface Simple{
//这里定义了一个空的注解,它能干什么呢?我也不知道,但他能用。后面有补充
}


2. Мета-аннотации

Роль метааннотаций заключается в аннотировании других аннотаций. Java 5.0 определяет четыре стандартных типа метааннотаций, которые используются для предоставления описаний для других типов аннотаций. В Java 5.0 определены четыре метааннотации:

Эти типы и классы, которые они поддерживают, можно найти в пакете java.lang.annotation.

@Target

Используется для описания области применения аннотации (т. е.: где можно использовать описанную аннотацию).Указывает тип элемента программы, который поддерживает аннотации.Некоторые возможные значения: ТИП, МЕТОД, КОНСТРУКТОР, ПОЛЕ и т. д. Если мета-аннотация Target не существует, то аннотацию можно использовать для любого элемента программы.

Значения (ElementType):

1. КОНСТРУКТОР: используется для описания конструктора.
2. ПОЛЕ: используется для описания домена.
3.LOCAL_VARIABLE: используется для описания локальных переменных.
4.МЕТОД: Используется для описания метода
5.PACKAGE: используется для описания пакета
6.ПАРАМЕТР: используется для описания параметров
7.TYPE: используется для описания классов, интерфейсов (включая типы аннотаций) или объявлений enum.

На этом этапе добавьте метааннотацию @Target к пустой аннотации, например:

//此注解只能用在方法上
@Target(ElementType.METHOD) 
@interface TestMethod {}

@Retention

Указывает, на каком уровне должна быть сохранена информация аннотации для описания жизненного цикла аннотации (т. е. описанная аннотацияразвязатьдействует в каком диапазоне)Указывает, как долго сохраняется тип аннотации.

Значения (RetentionPoicy):

1. ИСТОЧНИК: Действителен в исходном файле (то есть исходный файл сохраняется)
2. КЛАСС: Действителен в файлах класса (т.е. резервирование класса)
3.RUNTIME: Действителен во время выполнения (то есть зарезервирован во время выполнения)

На этом этапе добавьте метааннотацию @Retention к вышеуказанным аннотациям, например:

// 此注解可以用于注解类、接口(包括注解类型) 或enum声明
@Target(ElementType.TYPE) 
//该注解运行时有效。注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Retention(RetentionPolicy.RUNTIME)
@interface TestRn{
}


@Documented

Указывает, что элементы, использующие эту аннотацию, должны быть задокументированы с помощью javadoc или аналогичного инструмента и что это применимо к объявлениям типов.Аннотации объявлений типов влияют на использование клиентом аннотированного элемента. Если объявление типа снабжено аннотацией Documented, то его аннотация становится частью общедоступного API аннотируемого элемента. @Documented — это аннотация разметки.

//可以被例如javadoc此类的工具文档化
@Documented
@interface TestDoc{	
}

@Inherited

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

//被子类继承的注解
@Inherited
@interface TestInheri{}


3. Подробные пользовательские аннотации

При использовании пользовательских аннотаций @interface автоматически наследуется java.lang.annotation.AnnotationИнтерфейс, остальные детали выполняются автоматически компилятором. При определении аннотации другие аннотации или интерфейсы не могут наследоваться.

(1) Определите формат аннотации:

@interface используется для объявления аннотации, где каждый метод фактически объявляет параметр конфигурации. Имя метода — это имя параметра, а тип возвращаемого значения — тип параметра (тип возвращаемого значения может быть толькоОсновные типы, класс, строка, перечисление). Значение параметра по умолчанию может быть объявлено по умолчанию.

public @interface имя аннотации {тело определения}

(2) Параметры аннотации (т.е. методы)

Каждый метод в аннотации фактически объявляет параметр конфигурации, правила таковы:

① Модификатор

Может быть изменено только с общедоступными или стандартными (по умолчанию) правами доступа, по умолчанию используется значение по умолчанию.

②Тип

Параметры аннотации поддерживают только следующие типы данных:

Основные типы данных (int, float, boolean, byte, double, char, long, short);

Тип строки;

тип класса;

тип перечисления;

Тип аннотации;

Массивы всех вышеперечисленных типов

③ Именование

Требований к имени нет. Если есть только один член параметра, лучше всего установить имя параметра на ""value", после чего следуют скобки.

④Параметр

Метод в аннотации не может иметь параметров

⑤ Значение по умолчанию

Можно включить значения по умолчанию, используйте default, чтобы объявить значение по умолчанию.

(3) Примеры следующие.

/*
 * 码农定义注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface Programmer{
	String value() default "马云";
}
/**
 * 码农类型注解
 * @author peida
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface ProgrammerType {
    /**
     * 类型枚举  程序猿 射鸡师
     */
    public enum CoderType{MONKEYS,LION,CHOOK};
    /**
     * 颜色属性
     */
    CoderType type() default CoderType.MONKEYS;
}
/**
 * 码农制造厂
 * @author Administrator
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface ProgrammerProductor {
    /**
     * 厂家编号
     * @return
     */
    public int id() default -1;
    /**
     * 厂家名称
     * @return
     */
    public String name() default "shsxt"; 
    /**
     * 厂家地址
     * @return
     */
    public String address() default "上海";
}
/**
 * 注解使用
*/
class Coder{
		@Programmer("老裴")
	    private String coderName;
		@ProgrammerType(type=CoderType.MONKEYS)
	    private String coderType;
		@ProgrammerProductor(id=1,name="程序猿乐园",address="荣乐东路")
	    private String coderProductor;
		public String getCoderName() {
			return coderName;
		}
		public void setCoderName(String coderName) {
			this.coderName = coderName;
		}
		public String getCoderType() {
			return coderType;
		}
		public void setCoderType(String coderType) {
			this.coderType = coderType;
		}
		public String getCoderProductor() {
			return coderProductor;
		}
		public void setCoderProductor(String coderProductor) {
			this.coderProductor = coderProductor;
		}	
}

乐字节原创,转载请注明出处