Java Анотация е таг, който представлява метаданни т.е. прикрепен с клас, интерфейс, методи или полета за указване на допълнителна информация, която може да се използва от компилатора на Java и JVM.
Анотациите в Java се използват за предоставяне на допълнителна информация, така че това е алтернативна опция за XML и Java маркерни интерфейси.
Първо ще научим някои вградени анотации, след което ще продължим да създаваме и използваме персонализирани анотации.
Вградени анотации на Java
В Java има няколко вградени анотации. Някои анотации се прилагат към Java код, а други към други анотации.
Вградени анотации на Java, използвани в кода на Java
- @Override
- @SuppressWarnings
- @Отхвърлено
Вградени анотации на Java, използвани в други анотации
- @Мишена
- @Задържане
- @Наследено
- @Документирано
Разбиране на вградените анотации
Нека първо разберем вградените анотации.
@Override
Анотацията @Override гарантира, че методът на подклас замества метода на родителския клас. Ако не е така, възниква грешка при компилиране.
Понякога правим глупави грешки, като например правописни грешки и т.н. Така че е по-добре да маркирате @Override анотация, която осигурява сигурност, че методът е заменен.
char и int java
class Animal{ void eatSomething(){System.out.println('eating something');} } class Dog extends Animal{ @Override void eatsomething(){System.out.println('eating foods');}//should be eatSomething } class TestAnnotation1{ public static void main(String args[]){ Animal a=new Dog(); a.eatSomething(); }}Тествайте сега
Output:Comple Time Error
@SuppressWarnings
@SuppressWarnings анотация: използва се за потискане на предупреждения, издадени от компилатора.
import java.util.*; class TestAnnotation2{ @SuppressWarnings('unchecked') public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('sonoo'); list.add('vimal'); list.add('ratan'); for(Object obj:list) System.out.println(obj); }}Тествайте сега
Now no warning at compile time.
Ако премахнете анотацията @SuppressWarnings('unchecked'), тя ще покаже предупреждение по време на компилиране, защото използваме негенерична колекция.
@Отхвърлено
@Deprecated annoation означава, че този метод е остарял, така че компилаторът отпечатва предупреждение. Той информира потребителя, че може да бъде премахнат в бъдещите версии. Така че е по-добре да не използвате такива методи.
грешка: не можах да намеря или заредя основния клас
class A{ void m(){System.out.println('hello m');} @Deprecated void n(){System.out.println('hello n');} } class TestAnnotation3{ public static void main(String args[]){ A a=new A(); a.n(); }}Тествайте сега
По време на компилиране:
Note: Test.java uses or overrides a deprecated API. <br> Note: Recompile with -Xlint:deprecation for details.
По време на изпълнение:
hello n
Персонализирани анотации на Java
Java персонализирани анотации или Java Дефинираните от потребителя анотации са лесни за създаване и използване. The @интерфейс елемент се използва за деклариране на анотация. Например:
@interface MyAnnotation{}
Тук MyAnnotation е името на персонализираната анотация.
Точки, които трябва да запомните за персонализиран подпис на анотация на java
Има няколко точки, които трябва да се запомнят от програмиста.
- Методът не трябва да има клаузи за хвърляния
- Методът трябва да върне едно от следните: примитивни типове данни, низ, клас, enum или масив от тези типове данни.
- Методът не трябва да има параметър.
- Трябва да прикачим @ точно преди ключовата дума за интерфейс, за да дефинираме анотация.
- Може да присвои стойност по подразбиране на метода.
Видове анотация
Има три вида анотации.
- Маркер Анотация
- Анотация с една стойност
- Анотация с много стойности
1) Анотация на маркера
Анотация, която няма метод, се нарича маркерна анотация. Например:
@interface MyAnnotation{}
@Override и @Deprecated са анотации към маркери.
2) Анотация с една стойност
Анотация, която има един метод, се нарича анотация с една стойност. Например:
@interface MyAnnotation{ int value(); }
Можем да предоставим и стойността по подразбиране. Например:
@interface MyAnnotation{ int value() default 0; }
Как да приложите анотация с една стойност
Нека видим кода за прилагане на анотацията за единична стойност.
на колко години е Пийт Дейвидсън
@MyAnnotation(value=10)
Стойността може да бъде всякаква.
3) Анотация с много стойности
Анотация, която има повече от един метод, се нарича многостойностна анотация. Например:
@interface MyAnnotation{ int value1(); String value2(); String value3(); } }
Можем да предоставим и стойността по подразбиране. Например:
@interface MyAnnotation{ int value1() default 1; String value2() default ''; String value3() default 'xyz'; }
Как да приложите многостойностна анотация
Нека видим кода за прилагане на многостойностната анотация.
@MyAnnotation(value1=10,value2='Arun Kumar',value3='Ghaziabad')
Вградени анотации, използвани в персонализирани анотации в java
- @Мишена
- @Задържане
- @Наследено
- @Документирано
@Мишена
@Мишена се използва за указване на кой тип се използва анотацията.
Анотацията java.lang. ElementType enum декларира много константи, за да уточни типа на елемента, към който трябва да се приложи анотацията, като TYPE, METHOD, FIELD и т.н. Нека видим константите на ElementType enum:
тестване за съвместимост
Типове елементи | Къде може да се приложи анотацията |
---|---|
ТИП | клас, интерфейс или изброяване |
ПОЛЕ | полета |
МЕТОД | методи |
КОНСТРУКТОР | конструктори |
LOCAL_VARIABLE | локални променливи |
ANNOTATION_TYPE | тип анотация |
ПАРАМЕТЪР | параметър |
Пример за указване на анотация за клас
@Target(ElementType.TYPE) @interface MyAnnotation{ int value1(); String value2(); }
Пример за указване на анотация за клас, методи или полета
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) @interface MyAnnotation{ int value1(); String value2(); }
@Задържане
@Задържане анотацията се използва за указване на какво ниво анотацията ще бъде налична.
Политика на задържане | Наличност |
---|---|
RetentionPolicy.SOURCE | се отнася до изходния код, изхвърлен по време на компилация. Той няма да бъде наличен в компилирания клас. |
RetentionPolicy.CLASS | се отнася до .class файла, достъпен за java компилатора, но не и за JVM. Той е включен във файла на класа. |
RetentionPolicy.RUNTIME | се отнася до времето за изпълнение, достъпно за компилатора на Java и JVM. |
Пример за указване на RetentionPolicy
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface MyAnnotation{ int value1(); String value2(); }
Пример за персонализирана анотация: създаване, прилагане и достъп до анотация
Нека видим простия пример за създаване, прилагане и достъп до анотация.
Файл: Test.java
//Creating annotation import java.lang.annotation.*; import java.lang.reflect.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface MyAnnotation{ int value(); } //Applying annotation class Hello{ @MyAnnotation(value=10) public void sayHello(){System.out.println('hello annotation');} } //Accessing annotation class TestCustomAnnotation1{ public static void main(String args[])throws Exception{ Hello h=new Hello(); Method m=h.getClass().getMethod('sayHello'); MyAnnotation manno=m.getAnnotation(MyAnnotation.class); System.out.println('value is: '+manno.value()); }}Тествайте сега
Output:value is: 10
изтеглете този пример
Как се използват вградените анотации в реален сценарий?
В реален сценарий програмистът на Java трябва само да приложи анотация. Той/тя не се нуждае от създаване и достъп до анотация. Създаването и достъпът до анотация се извършва от доставчика на внедряване. От името на анотацията Java компилаторът или JVM извършва някои допълнителни операции.
@Наследено
По подразбиране анотациите не се наследяват от подкласове. Анотацията @Inherited маркира анотацията, която ще бъде наследена на подкласове.
@Inherited @interface ForEveryone { }//Now it will be available to subclass also @interface ForEveryone { } class Superclass{} class Subclass extends Superclass{}
@Документирано
@Documented Маркира анотацията за включване в документацията.