JavaTrip and tricks

Adnotacje w języku Java

1. Wprowadzenie

Wraz z Java 1.5 zostały wprowadzone adnotacje. Adnotacjami nazywamy dodatkowe informacje (metadane) umieszczone w kodzie programu źródłowego, które nie wpływają na działanie programu. Wielu początkujących programistów nie jest w stanie dostrzec ich zastosowania. Dopiero po zapoznaniu się z nimi i dłuższym programowaniu widać ich sens. Mam nadzieję, że po przeczytaniu tego artykułu ujrzysz możliwe zastosowania i potencjał ich wykorzystania.

Możliwe wykorzystania:

– Meta programowanie
– Tworzenie własnych wskazówek
– Sterowanie komunikatami generowanymi przez kompilator
– Wiele innych

2. Tworzenie adnotacji

W menu kontekstowym pakietu wybierz:

Następnie w nowym oknie podaj nazwę dla adnotacji. Zostanie wygenerowany kod. Jak łatwo zauważyć, nazwa naszej adnotacji została poprzedzona słowem kluczowym @interfece. Nasze adnotacje są oparte o mechanizm tworzenia interfejsów, ale dodatkowy przedrostek @ sygnalizuje kompilatorowi, że ma do czynienia z adnotacjami.

public @interface MyAnnotation {

}

Ważną uwagą jest to, że adnotacje nie mogą dziedziczyć ale wszystkie rozszerzają interface Annotations. Podobnie jak w interfejsie, nie deklarujemy pełnych metod, lecz tylko sygnatury.

3. Przypisywanie do typów deklaracji

Umieszczenie nad @interfejsem klauzuli:

@Target()

Pozwala zdefiniować typy deklaracji, dla których będziemy mogli stosować naszą adnotację. Przykładowa implementacja:

@Target(ElementType.METHOD)

Wewnątrz nawiasu podajemy enuma, w tym przypadku jest to METHOD. Oznacza to, że adnotację będziemy mogli umieścić tylko i wyłącznie przy metodzie. Umieszczenie jej przy np. zmiennej czy klasie wywoła błąd kompilatora.
Jeżeli chcemy naszą adnotację zastosować do więcej niż jednego typu deklaracji, wystarczy, że interesujące nas typy ujmiemy w klamry i po przecinku je wypiszemy:

@Target({ElementType.METHOD, ElementType.FIELD})
 public @interface MyAnnotation {

}

4. Strategie zachowania

Możemy zażądać, aby nasza adnotacja cechowała się konkretnym zachowaniem. Możliwe są 3 tryby:

- SOURCE // pomijana w trakcie kompilacji, występuje tylko w kodzie źródłowym
- CLASS // powyższe + dostępność również w pliku .class
- RUNTIME // powyższe + możliwość korzystania z adnotacji w czasie działania programu.

Aby wykorzystać wybraną strategię przed deklaracją @interfejsu za pomocą słówka kluczowego

Retention

definiujemy strategię jak widać to poniżej:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface MyAnnotation {

}

5. Definiowanie adnotacji

Definiowanie adnotacji wygląda zupełnie tak samo jak tworzenie metod w interfejsie:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface MyAnnotation {
String A();
String B();
}

Prezentując wykorzystanie na przykładzie, otrzymuję:

public class MySimpleClass {

@MyAnnotation(A = "", B = "")
void simpleMethod() {

}
}

Gdzie wewnątrz cudzysłowu mogę podać wybrane przez siebie wartości. Aby je odczytać, odwołuję się do nich poprzez refleksję. Poniżej kod źródłowy programu, który w moim przypadku wypisuję na ekranie konsoli wartość adnotacji A:

public class MySimpleClass {
MySimpleClass() {
simpleMethod();
}

@MyAnnotation(A = "TestA", B = "TestB")
public void simpleMethod() {
MyAnnotation annot = null;
try {
annot = this.getClass().getMethod("simpleMethod").getAnnotation(MyAnnotation.class); // pobieram bierzącą klase, a następnie metodę, której tyczy się adnotracja. Z metody wyciągam adnotracje
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
System.out.println(annot.A()); // w kodzie program mogę wypisać wartości moich adnotracji A i B
}

public static void main(String args[]) {
new MySimpleClass();
}
}

Po takim przykładzie od razu na myśl nasuwają się przykładowe zastosowania. Może teraz jesteś przekonany, że adnotacje mogę być naprawdę przydatne.

Tags:
Show Buttons
Hide Buttons