advanced.java
← Tous les concepts
Enums et annotations · ch. 5, p. 42

Rétention et cibles des annotations

@Retention détermine si une annotation survit jusqu'au fichier .class et jusqu'à l'exécution ; @Target restreint où elle peut être écrite. Seule la rétention RUNTIME est visible par réflexion.

PolitiqueConservée dans le .classVisible par réflexionUsage typique
SOURCEnonnon@Override, Lombok
CLASS (par défaut)ouinonoutils de bytecode
RUNTIMEouiouiSpring, JPA, Jackson
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Inherited
public @interface Audited {
    String value() default "";
    Level level() default Level.INFO;
}

Détails qui piègent

  • @Inherited s’applique uniquement aux annotations de niveau classe, et seulement le long d’une chaîne de superclasses — jamais à travers les interfaces.
  • Les éléments peuvent être des primitives, String, Class, des enums, d’autres annotations, ou des tableaux de ceux-ci. Rien d’autre.
  • Un élément nommé value peut être écrit positionnellement : @Audited("payment").

Annotations répétables

@Repeatable(Schedules.class)
public @interface Schedule { String cron(); }

C’est du sucre syntaxique du compilateur. Les deux occurrences sont enveloppées dans l’annotation conteneur, donc la réflexion doit demander Schedules — ou utiliser getAnnotationsByType, qui les déballe pour vous.

3 questions sur ce concept S'entraîner