Tworzenie adnotacji
Definicja pustej adnotacji nie różni się specjalnie od definicji pustego interfejsu. Pomijając znaczek @ w słówku @interface w zasadzie nie ma żadnej różnicy.
package com.blogspot.mkorwel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationMethod {
}
Stworzenie adnotacji wymaga jeszcze użycia metaadnotacji. Poniżej umieszczam krótki opis:- @Target określa miejsce stosowania adnotacji
- @Retention określa trwałość adnotacji
- @Documented ujęcie danej adnotacji w dokumencie Javadoc
- @Inherited zezwolenie na dziedziczenie adnotacji w podklasach
Możliwe argumenty dla metaadnotacji @Target to:
- ElementType.TYPE - w deklaracji klasy, interfejsu, adnotacji, enum
- ElementType.CONSTRUCTOR - w deklaracji konstruktora
- ElementType.FIELD - w deklaracji pola
- ElementType.LOCAL_VARIABLE - w deklaracji zmiennej lokalnej
- ElementType.METHOD - w deklaracji metody
- ElementType.PACKAGE - w deklaracji pakietu
- ElementType.PARAMETER - w deklaracji parametru
Możliwe argumenty dla metaadnotacji @Retention to:
- RetentionPolicy.SOURCE - adnotacje unieważnione przez kompilator
- RetentionPolicy.CLASS - adnotacje widoczne w plikach klas, unieważnione przez maszynę wirtualną
- RetentionPolicy.RUNTIME - adnotacje podtrzymywane w maszynie wirtualnej w czasie wykonania, a więc nadające się do odczytu za pośrednictwem refleksji
Poniżej stworzymy jeszcze jedną adnotację która będzie używana przy deklaracji klas (@Target(ElementType.TYPE)). Adnotacja będzie zawierała dwa elementy. Poniżej kod:
package com.blogspot.mkorwel.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotationClass {
public int id() default -1;
public String name();
}
Elementy w adnotacjach deklarujemy podobnie do metod w intefejsie. Każdy element może mieć wartość domyślną, aby ustalić taką wartość używamy słówka default.Wykorzystanie adnotacji
Po stworzeniu dwóch naszych adnotacji, możemy użyć ich w naszej klasie. Kod klasy nie jest zbyt skomplikowany, więc nie będę go opisywał.
package com.blogspot.mkorwel;
import com.blogspot.mkorwel.annotation.MyAnnotationClass;
import com.blogspot.mkorwel.annotation.MyAnnotationMethod;
@MyAnnotationClass(id = 1, name = "Mateusz")
public class MyClass {
@MyAnnotationMethod
public void test(){
}
}
Kiedy mamy już adnotacje i klasę która jest nimi opisana, możemy stworzyć klasę która wykorzysta nasze adnotacje i wypisze komunikat na ekranie. Kod klasy która to robi znajduje się poniżej:
package com.blogspot.mkorwel;
import com.blogspot.mkorwel.annotation.MyAnnotationClass;
/**
*
* @author Mateusz Korwel
*
*/
public class Test {
public static void main(String[] args) {
// tworzenie klasy
MyClass myClass = new MyClass();
Class clazz = myClass.getClass();
// pobranie adnotacji w klasie
for (int i = 0; i < clazz.getAnnotations().length; i++) {
// wypisanie adnotacji
System.out.println("Nazwa adnotacji: " + clazz.getAnnotations()[i]);
System.out.println("Wartość atrybutu id: "
+ ((MyAnnotationClass) clazz.getAnnotations()[i]).id());
System.out.println("Wartość atrybutu name: "
+ ((MyAnnotationClass) clazz.getAnnotations()[i]).name());
}
// pobranie wszystkich publicznych/pakietowych metod z klasy MyClass
for (int i = 0; i < clazz.getMethods().length; i++) {
// pobranie wszystkich adnotacji przypisanych do metody
for (int j = 0; j < clazz.getMethods()[i].getAnnotations().length; j++) {
// nazwa metody z adnotacją
System.out.println("\nNazwa metody z adnotacją: "
+ clazz.getMethods()[i].getName());
// wypisanie adnotacji
System.out.println("Nazwa adnotacji: "
+ clazz.getMethods()[i].getAnnotations()[j]);
}
}
}
}
Krótko opiszę co powyższa klasa robi. W pierwszej pętli for pobieramy wszystkie adnotacje które są przypisane do klasy. W naszym przypadku jest to tylko jedna adnotacja @MyAnnotationClass z dwoma elementami które zostaną również wypisane. Druga pętla for pobiera metody jakie znajdują się w klasie, a następnie pobiera adnotacje przypisane do kolejnych metod. W naszym przypadku będzie wypisana jedna metoda test() z jedną adnotacją @MyAnnotationMethod.
Brak komentarzy:
Prześlij komentarz