Achtergrond van de vraag:
Annotaties zijn geïntroduceerd in Java 5 om metadata aan de bytecode toe te voegen zonder de logica van het programma te wijzigen. Met annotaties is het gemakkelijk om klassen en methoden te voorzien van aanvullende informatie voor frameworks, compilers of parsers.
Probleem:
Slecht ontworpen of verkeerd gebruikte annotaties leiden tot een complexe ondersteuning van de code. Soms verwarren ontwikkelaars het gebruik van annotaties of begrijpen ze niet hoe ze hun eigen moeten maken en zijn ze zich niet bewust van de mogelijkheid om annotaties met parameters te maken.
Oplossing:
Creëren van een eigen annotatie:
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest { String value() default ""; }
Gebruik van de annotatie:
public class TestClass { @MyTest("Voorbeeld") public void testMethod() {...} }
Belangrijke kenmerken:
Kan een annotatie van een andere annotatie erven?
Antwoord: Nee, annotaties in Java ondersteunen geen overerving tussen elkaar.
Kan het gebruik van een annotatie verplicht worden gesteld voor alle subklassen?
Antwoord: Niet direct. Het is nodig om bijkomend te controleren op de aanwezigheid van de annotatie via reflectie, waarbij deze controle handmatig wordt geïmplementeerd.
Wat is het verschil tussen @Retention(CLASS) en @Retention(RUNTIME)?
Antwoord:
In een project besloten ze de configuratie via xml te vervangen door annotaties, maar ze voegden niet @Retention(RUNTIME) toe.
Voordelen:
Nadelen:
We hebben een aangepaste annotatie @Audit ingesteld voor methoden, die de audit van bedrijfsoperaties controleert, met reflectie naar de daadwerkelijke logica-aanroep op de server.
Voordelen:
Nadelen: