136 votes

Est-il possible de lire la valeur d'une annotation en Java?

c'est mon code:

 @Column(columnName="firstname")


private String firstName;

 @Column(columnName="lastname")
 private String lastName;

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 

est-il possible de lire la valeur de mon annotation @Column ( columnName = "xyz123") dans une autre classe?

156voto

Cephalopod Points 4927

Oui, si votre annotation de colonne a la rétention d'exécution

 @Retention(RetentionPolicy.RUNTIME)
@interface Column {
    ....
}
 

tu peux faire quelque chose comme ça

 for (Field f: MyClass.class.getFields()) {
   Column column = f.getAnnotation(Column.class);
   if (column != null)
       System.out.println(column.columnName());
}
 

97voto

lucho Points 2320

Bien sûr que ça l'est. Voici un exemple d'annotation:

 @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation
{
    String testText();
}
 

Et un exemple de méthode annotée:

 class TestClass
{
    @TestAnnotation(testText="zyx")
    public void doSomething(){}
}
 

Et un exemple de méthode dans une autre classe qui affiche la valeur du testText:

 Method[] methods = TestClass.class.getMethods();
for (Method m : methods)
{
        if (m.isAnnotationPresent(TestAnnotation.class))
    {
        TestAnnotation ta = m.getAnnotation(TestAnnotation.class);
        System.out.println(ta.testText());
    }
}
 

Pas très différent pour les annotations sur le terrain comme le vôtre.

Cheerz!

25voto

T.J. Crowder Points 285826

Je ne l'ai jamais fait, mais il semble que la Réflexion fournit cette. Field est AnnotatedElement a getAnnotation. Cette page est un exemple (copié ci-dessous); assez simple si vous savez la classe de l'annotation et si l'annotation politique conserve l'annotation au moment de l'exécution. Naturellement, si la politique de conservation ne pas conserver l'annotation au moment de l'exécution, vous ne serez pas en mesure de requête lors de l'exécution.

Une réponse qui a depuis été supprimé (?) fourni un lien utile pour un des annotations tutoriel que vous trouverez peut-être utile; j'ai copié le lien ici pour que les gens puissent l'utiliser.

Exemple à partir de cette page:

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
  String str();

  int val();
}

class Meta {
  @MyAnno(str = "Two Parameters", val = 19)
  public static void myMeth(String str, int i) {
    Meta ob = new Meta();

    try {
      Class c = ob.getClass();

      Method m = c.getMethod("myMeth", String.class, int.class);

      MyAnno anno = m.getAnnotation(MyAnno.class);

      System.out.println(anno.str() + " " + anno.val());
    } catch (NoSuchMethodException exc) {
      System.out.println("Method Not Found.");
    }
  }

  public static void main(String args[]) {
    myMeth("test", 10);
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X