Аннотации встраивают дополнительную информацию в исходный файл. Аннотаций не меняет семантику программы. Аннотаций создаются с помощью механизма, основанного на интерфейсе.
Следующий код объявляет аннотацию называется Test
//nookery.ru
@interface Test {
String str();
int one();
}
Аннотация использует знак @ которая предшествует перед ключевым словом interface. Таким образом компилятору уже известно что объявлен тип аннотации. Далее идут два метода, методы в аннотациях лишь объявляются но тела они не имеют.
Все типы аннотаций автоматически расширяют интерфейс Annotation. Annotation является супер-интерфейсом всех аннотаций. Он объявлен в пакете java.lang.annotation.
Любой тип декларации может иметь аннотацию, связанную с ним. Например, классы, методы, поля, параметры и константы перечислений могут быть аннотированы. Во всех случаях, аннотация предшествует остальной части объявлений. При применении аннотацию, вы даете значения своим членам.
Политика удержания аннотации Java
Политика хранения определяет, в какой момент отбрасывают аннотацию.
Java определяет три такие политики:SOURCE, CLASS и RUNTIME.
- SOURCE сохраняется только в исходном файле и отбрасывается во время компиляции.
- CLASS хранится в файле .class во время компиляции. Он не доступен через JVM во время выполнения.
- RUNTIME хранится в файле .class и доступен через JVM во время выполнения.
Политика хранения задается для аннотирования, используя один из встроенных в аннотации языка Java.
@Retention
Его общая форма показана здесь:
@Retention (Удержание политики)
удержанием должна быть одна из политик: SOURCE, CLASS или RUNTIME. Политикой по умолчанию является CLASS.
Следующий код определяет политику хранения для среды RUNTIME.
//nookery.ru
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface Test {
String str();
int one();
}
Получаем Аннотацию во время выполнения с использованием Reflection.
//nookery.ru
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
/* w w w . j a v a2 s .co m*/
// An annotation type declaration.
@Retention(RetentionPolicy.RUNTIME)
@interface Test {
String str();
int one();
}
public class Gl {
@Test(str = "Пример Аннотации", one = 50)
public static void myMeth() {
Gl gl = new Gl();
try {
Class c = gl.getClass();
Method m = c.getMethod("Мой метод");
Test test = m.getAnnotation(Test.class);
System.out.println(test.str() + " " + test.one());
} catch (NoSuchMethodException exc) {
System.out.println("Метод не найден.");
}
}
public static void main(String args[]) {
myMeth();
}
}
Результатом работы программы будет: 50
Аннотация Java отражение
Вы можете получить все аннотации, которые имеют правила удержания RUNTIME, которые связаны с элементом, используя для вызова метод getAnnotations () для этого элемента.
Он имеет следующий общий вид:
Annotation[]getAnnotations()
Следующий код показывает, как получить аннотаций из класса.
//nookery.ru
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@interface Test {
String str();
int one();
}
@Retention(RetentionPolicy.RUNTIME)
@interface What {
String description();
}
@What(description = "Аннотация")
@Test(str = "Meta2", one = 99)
public class Gl {
@What(description = "метод")
@Test(str = "Тест", one = 50)
public static void myMeth() throws Exception {
Gl gl = new Gl();
Annotation annos[] = gl.getClass().getAnnotations();
System.out.println("Все аннотации Meta2:");
for (Annotation a : annos) {
System.out.println(a);
}
Method m = gl.getClass().getMethod("myMeth");
annos = m.getAnnotations();
for (Annotation a : annos) {
System.out.println(a);
}
}
public static void main(String args[]) throws Exception {
myMeth();
}
}
Результатом работы программы будет:
Все аннотации Meta2:
@TestPackage.What(description=Аннотация)
@TestPackage.Test(str=Meta2, one=99)
@TestPackage.What(description=метод)
@TestPackage.Test(str=Тест, one=50)
