w , ,

FajneFajne Dobre!Dobre! ŚwietnieŚwietnie Że co?Że co? WnerwWnerw SmuteczekSmuteczek

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. Własne adnotacje w Java

W menu kontekstowym pakietu wybierz:

Sposób, aby dodać adnotacje w języku Java
Tworzenie adnotacji z Eclipse

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. Adnotacje w Java – strategie zachowania

W Java możemy zażądać, aby nasze adnotacje cechowały 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 w Java

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 annotationValues = null;
        try {
            annotationValues = this.getClass()
                    .getMethod("simpleMethod")
                    .getAnnotation(MyAnnotation.class);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        // wypisuje wartosc adnotacji A
        System.out.println(annotationValues.A());
    }

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

W linii 11 pobieram metadane metody a następnie pozyskuje informacje na temat przypisanej do niej adnotacji.

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.

Szczególne zastosowanie adnotacji ma miejsce w Spring Boot, gdzie z wykorzystaniem adnotacji zarządzamy cyklem aplikacji.

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Typy generyczne na platformie .NET

Diagram klas