Historia pytania:
Adnotacje pojawiły się w Javie 5, aby dodać metainformacje do bajtkodu bez zmieniania samej logiki programu. Dzięki adnotacjom łatwo można zaopatrzyć klasy i metody w dodatkowe informacje dla frameworków, kompilatorów lub parserów.
Problem:
Źle zaprojektowane lub niewłaściwie używane adnotacje prowadzą do utrudnienia wsparcia kodu. Czasami programiści mylą zastosowanie adnotacji lub nie rozumieją, jak tworzyć własne, i nie wiedzą o możliwości tworzenia adnotacji z parametrami.
Rozwiązanie:
Tworzenie własnej adnotacji:
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest { String value() default ""; }
Użycie adnotacji:
public class TestClass { @MyTest("Przykład") public void testMethod() {...} }
Kluczowe cechy:
Czy adnotacja może dziedziczyć po innej adnotacji?
Odpowiedź: Nie, adnotacje w Javie nie wspierają dziedziczenia między sobą.
Czy można wymusić działanie adnotacji we wszystkich dziedziczących klasach?
Odpowiedź: Nie bezpośrednio. Należy dodatkowo sprawdzić obecność adnotacji przez refleksję, ręcznie wdrażając podobną kontrolę.
Czym się różni @Retention(Class) od @Retention(RUNTIME)?
Odpowiedź:
W projekcie zdecydowano się zastąpić konfigurację przez xml adnotacjami, ale nie dodano @Retention(RUNTIME)
Zalety:
Wady:
Skonfigurowano niestandardową adnotację @Audit dla metod, która kontroluje audyt operacji biznesowych, z refleksją rzeczywistego wywołania logiki na serwerze.
Zalety:
Wady: