Аннотации встраивают дополнительную информацию в исходный файл. Аннотаций не меняет семантику программы. Аннотаций создаются с помощью механизма, основанного на интерфейсе.
Следующий код объявляет аннотацию называется Test
1 2 3 4 5 6 |
//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.
1 |
@Retention |
Его общая форма показана здесь:
1 |
@Retention (Удержание политики) |
удержанием должна быть одна из политик: SOURCE, CLASS или RUNTIME. Политикой по умолчанию является CLASS.
Следующий код определяет политику хранения для среды RUNTIME.
1 2 3 4 5 6 7 8 9 10 11 |
//nookery.ru import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface Test { String str(); int one(); } |
Получаем Аннотацию во время выполнения с использованием Reflection.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//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 () для этого элемента.
Он имеет следующий общий вид:
1 |
Annotation[]getAnnotations() |
Следующий код показывает, как получить аннотаций из класса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
//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)