Je vais présenter un exemple de programme qui crée une annotation personnalisée en Java et acquiert la valeur de l'annotation.
C:\>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
C:\>
Ceci est un exemple d'annotation personnalisée. Ici, les membres ont "nom" et "valeur".
MyAnnotation.java
package test01;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // (1) @Contrôlez la quantité d'informations d'annotation conservées dans Retantion
@Target({ // (2) @Target Contrôle quel type d'élément peut être annoté
ElementType.TYPE,
ElementType.FIELD,
ElementType.CONSTRUCTOR,
ElementType.METHOD
})
public @interface MyAnnotation { // (3)Créer MyAnnotation
String name();
int value() default 0;
}
Spécifiez à quel stade les informations d'annotation sont conservées par @ Retention
dans (1).
Les éléments suivants peuvent être principalement définis pour «@ Retention».
valeur | La description |
---|---|
RetentionPolicy.SOURCE | Les annotations sont conservées uniquement au niveau source et sont ignorées par le compilateur. |
RetentionPolicy.CLASS | Les annotations sont conservées par le compilateur au moment de la compilation, mais sont ignorées par la machine virtuelle Java (JVM). |
RetentionPolicy.RUNTIME | Les annotations sont conservées par la JVM et peuvent être utilisées dans un environnement d'exécution. |
Ici, spécifiez RetentionPolicy.RUNTIME
.
Spécifiez l'emplacement où l'annotation peut être appliquée avec @ Target
dans (2).
Les éléments suivants peuvent être principalement définis pour «@ Target».
valeur | La description |
---|---|
ElementType.TYPE | Rendez-le applicable aux classes, interfaces, annotations et types enum. |
ElementType.FIELD | Rendez-le applicable au terrain. |
ElementType.CONSTRUCTOR | Rendez-le applicable au constructeur. |
ElementType.METHOD | Rendez-le applicable à la méthode. |
Ici, spécifiez ʻElementType.TYPE, ʻElementType.FIELD
, ʻElementType.CONSTRUCTOR et ʻElementType.METHOD
dans @ Target
.
Dans (3), créez une annotation avec le nom «MyAnnotation». Définissez les membres sur «nom» et «valeur».
Ajoutez votre propre MyAnnotation
aux classes, champs, constructeurs et méthodes de la classe Sample
.
Sample.java
package test01;
@MyAnnotation(name="class", value=100) // (1)Accorder MyAnnotation à la classe
public class Sample {
@MyAnnotation(name="field", value=200) // (2)Accorder MyAnnotation au champ
private String name;
@MyAnnotation(name="constructor", value=300) // (3)Ajouter MyAnnotation au constructeur
public Sample() {}
@MyAnnotation(name="method", value=400) // (4)Accorder MyAnnotation à la méthode
public void execute() {
System.out.println("execute");
}
}
(1) Ajoutez votre propre annotation (MyAnnotation
) à la classe.
(2) Ajoutez votre propre annotation (MyAnnotation
) dans le champ.
(3) Ajoutez votre propre annotation (MyAnnotation
) au constructeur.
(4) Ajoutez votre propre annotation (MyAnnotation
) à la méthode.
Main.java
package test01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, SecurityException {
// (1)Obtenez l'annotation (MyAnnotation) attachée à la classe
Class<?> clazz = Class.forName("test01.Sample");
MyAnnotation annoClass = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
System.out.println("class annotation : name=" + annoClass.name() + ", value=" + annoClass.value());
// (2)Obtenez l'annotation (MyAnnotation) attachée au champ
Field field = clazz.getDeclaredField("name");
MyAnnotation annoField = (MyAnnotation) field.getAnnotation(MyAnnotation.class);
System.out.println("field annotation : name=" + annoField.name() + ", value=" + annoField.value());
// (3)Obtenez l'annotation (MyAnnotation) attachée au constructeur
Constructor<?> cons = clazz.getConstructor();
MyAnnotation annoCons = (MyAnnotation) cons.getAnnotation(MyAnnotation.class);
System.out.println("constructor annotation : name=" + annoCons.name() + ", value=" + annoCons.value());
// (4)Obtenez l'annotation (MyAnnotation) attachée à la méthode
Method method = clazz.getMethod("execute");
MyAnnotation annoMethod = (MyAnnotation) method.getAnnotation(MyAnnotation.class);
System.out.println("method annotation : name=" + annoMethod.name() + ", value=" + annoMethod.value());
}
}
(1) Acquiert et affiche le contenu de l'annotation (MyAnnotation
) attachée à la classe Sample
.
(2) Acquiert et affiche le contenu de l'annotation (MyAnnotation
) attachée au champ nom
de la classe Sample
.
(3) Acquiert et affiche le contenu de l'annotation (MyAnnotation
) attachée au constructeur de la classe Sample
.
(4) Acquiert et affiche le contenu de l'annotation (MyAnnotation
) attachée à la méthode ʻexecute de la classe
Sample`.
Lesson: Annotations (The Java™ Tutorials < Learning the Java Language)
c'est tout