Java Language Définition des types d'annotation


Exemple

Les types d'annotation sont définis avec @interface . Les paramètres sont définis de manière similaire aux méthodes d'une interface régulière.

@interface MyAnnotation {
    String param1();
    boolean param2();
    int[] param3();  // array parameter 
}

Les valeurs par défaut

@interface MyAnnotation {
    String param1() default "someValue";
    boolean param2() default true;
    int[] param3() default {};
}

Méta-annotations

Les méta-annotations sont des annotations pouvant être appliquées aux types d'annotation. Une méta-annotation prédéfinie spéciale définit comment les types d'annotation peuvent être utilisés.

@Cible

La méta-annotation @Target limite les types @Target l'annotation peut être appliquée.

@Target(ElementType.METHOD)
@interface MyAnnotation {
    // this annotation can only be applied to methods
}

Plusieurs valeurs peuvent être ajoutées en utilisant la notation de tableau, par exemple @Target({ElementType.FIELD, ElementType.TYPE})

Valeurs disponibles

ElementType cible exemple d'utilisation sur l'élément cible
ANNOTATION_TYPE types d'annotation
@Retention(RetentionPolicy.RUNTIME) 
@interface MyAnnotation
CONSTRUCTEUR constructeurs
@MyAnnotation
public MyClass() {}
CHAMP champs, constantes enum
@XmlAttribute
private int count;
VARIABLE LOCALE déclarations de variables à l'intérieur des méthodes
for (@LoopVariable int i = 0; i < 100; i++) {
@Unused
String resultVariable;
}
PAQUET package (dans package-info.java )
@Deprecated
package very.old;
MÉTHODE méthodes
@XmlElement
public int getCount() {...}
PARAMÈTRE paramètres de méthode / constructeur
public Rectangle(
@NamedArg("width") double width,
@NamedArg("height") double height) {
...
}
TYPE classes, interfaces, énumérations
@XmlRootElement
public class Report {}
Java SE 8
ElementType cible exemple d'utilisation sur l'élément cible
TYPE_PARAMETER Type de déclaration de paramètres
public <@MyAnnotation T> void f(T t) {}
TYPE_USE Utilisation d'un type
Object o = "42";
String s = (@MyAnnotation String) o;

@Rétention

La méta-annotation @Retention définit la visibilité de l'annotation pendant le processus de compilation ou d'exécution des applications. Par défaut, les annotations sont incluses dans les fichiers .class , mais ne sont pas visibles lors de l'exécution. Pour rendre une annotation accessible au moment de l'exécution, RetentionPolicy.RUNTIME doit être défini sur cette annotation.

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    // this annotation can be accessed with reflections at runtime
}

Valeurs disponibles

RetentionPolicy Effet
CLASSE L'annotation est disponible dans le fichier .class , mais pas à l'exécution
DUREE L'annotation est disponible au moment de l'exécution et est accessible via la réflexion
LA SOURCE L'annotation est disponible à la compilation, mais n'est pas ajoutée aux fichiers .class . L'annotation peut être utilisée, par exemple, par un processeur d'annotation.

@Documenté

La @Documented méta-annotation est utilisée pour marquer des annotations dont l' utilisation doit être documentée par des générateurs de documentation de l' API comme javadoc . Il n'a pas de valeurs. Avec @Documented , toutes les classes utilisant l'annotation le listeront sur leur page de documentation générée. Sans @Documented , il n'est pas possible de voir quelles classes utilisent l'annotation dans la documentation.

@Hérité

La méta-annotation @Inherited concerne les annotations appliquées aux classes. Il n'a pas de valeurs. Marquer une annotation comme @Inherited altère le fonctionnement de l'interrogation par annotation.

  • Pour une annotation non héritée, la requête examine uniquement la classe en cours d'examen.
  • Pour une annotation héritée, la requête vérifie également la chaîne de super-classe (récursivement) jusqu'à ce qu'une instance de l'annotation soit trouvée.

Notez que seules les super-classes sont interrogées: les annotations attachées aux interfaces dans la hiérarchie des classes seront ignorées.

@Repeatable

La méta-annotation @Repeatable été ajoutée à Java 8. Elle indique que plusieurs instances de l'annotation peuvent être attachées à la cible de l'annotation. Cette méta-annotation n'a aucune valeur.