Adnotacje zostały dodane do Javy w wersji 5 w celu dostarczenia metadanych, które mogą być wykorzystywane przez kompilator i różne frameworki. Początkowo pomagały narzędziom (np. JUnit czy Hibernate) lepiej wchodzić w interakcje z kodem bez potrzeby pisania powtarzalnych lub zewnętrznych konfiguracji.
Adnotacje umożliwiają dodawanie informacji do klas, metod, pól, parametrów, a nawet zmiennych lokalnych. Na etapie kompilacji, czasu wykonania lub podczas przetwarzania kodu źródłowego mogą być używane do walidacji, generowania dodatkowych plików lub zmiany zachowania programu.
Aby zadeklarować swoją adnotację, używa się słowa kluczowego @interface.
Przykład kodu:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } class Example { @MyAnnotation("Test") public void annotatedMethod() {} }
Kluczowe cechy:
Czy adnotacje wpływają tylko na czas wykonania?
Nie, adnotacje mogą być ograniczone tylko do kodu źródłowego (SOURCE), bajtkodu (CLASS) lub być dostępne na etapie wykonania (RUNTIME). Ich wpływ zależy od RetentionPolicy.
@Retention(RetentionPolicy.SOURCE) public @interface SourceOnly {}
Czy parametry adnotacji mogą być dowolnego typu?
Nie, dozwolone typy to tylko prymitywy, łańcuchy, enumeracje, inne adnotacje oraz tablice tych typów. Obiektów nie można używać.
Czy można dziedziczyć adnotacje?
Ściśle mówiąc, adnotacje nie dziedziczą się jak klasy. Wyjątkiem jest adnotacja z @Inherited, która rozprzestrzenia się tylko na klasy dziedziczące (w żaden sposób nie dotykając metod).
Programista w dużym projekcie stworzył dziesiątki różnych adnotacji do automatyzacji testów, nie udając się ich opisania, udokumentowania i ograniczenia zakresu działania. W rezultacie nowemu członkowi zespołu było trudno zrozumieć, które adnotacje gdzie działają.
Zalety:
Wady:
W zespole wprowadzono ścisłą strategię pisania swoich adnotacji: dodawano tylko niezbędne, szczegółowo opisywano każdą, i ograniczano ich zakres działania.
Zalety:
Wady: