ProgrammatieBackend ontwikkelaar

Leg uit hoe annotaties in Java zijn geïmplementeerd en hoe je je eigen aangepaste annotaties kunt maken. Hoe gebruik je ze correct in de praktijk?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Annotaties kunnen parameters met standaardwaarden hebben
  • Annotatie moet worden voorzien van de meta-annotaties @Target en @Retention
  • Gebruik van Runtime Retention stelt je in staat de annotatie via Reflectie te gebruiken

Trick vragen.

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:

  • @Retention(RUNTIME): de annotatie is beschikbaar tijdens runtime via reflectie
  • @Retention(CLASS): de annotatie wordt bewaard in de bytecode, maar is niet beschikbaar via Reflectie (wordt alleen door de compiler gebruikt)

Typische fouten en anti-patronen

  • Het niet opgeven van @Target en @Retention voor je annotaties
  • Annotaties voor andere doeleinden gebruiken (bijvoorbeeld ze behandelen met de verkeerde tools of buiten de ontworpen omgeving)

Levensecht voorbeeld

Negatieve case

In een project besloten ze de configuratie via xml te vervangen door annotaties, maar ze voegden niet @Retention(RUNTIME) toe.

Voordelen:

  • De code werd compacter

Nadelen:

  • Annotaties zijn niet zichtbaar tijdens runtime, het framework kan ze niet verwerken

Positieve case

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:

  • Gecentraliseerde, transparante audit

Nadelen:

  • De verwerking van annotaties vereist een kleine runtime overhead en een doordacht exception handling van loops