Est-il possible de lire la valeur d’une annotation dans Java?

c’est mon code:

@Column(columnName="firstname") private Ssortingng firstName; @Column(columnName="lastname") private Ssortingng lastName; public Ssortingng getFirstName() { return firstName; } public void setFirstName(Ssortingng firstName) { this.firstName = firstName; } public Ssortingng getLastName() { return lastName; } public void setLastName(Ssortingng lastName) { this.lastName = lastName; } 

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

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

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

vous pouvez 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()); } 

Bien sûr que oui. Voici un exemple d’annotation:

 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { Ssortingng 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 imprime la valeur de 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 de champs comme les vôtres.

Cheerz!

Je ne l’ai jamais fait, mais il semble que Reflection le fournisse. Field est un AnnotatedElement et a donc getAnnotation . Cette page a un exemple (copié ci-dessous); Très simple si vous connaissez la classe de l’annotation et si la stratégie d’annotation conserve l’annotation à l’exécution. Naturellement, si la stratégie de rétention ne conserve pas l’annotation à l’exécution, vous ne pourrez pas l’interroger à l’exécution.

Une réponse qui a depuis été supprimée (?) Fournit un lien utile vers un tutoriel d’annotations que vous pouvez trouver utile. J’ai copié le lien ici pour que les gens puissent l’utiliser.

Exemple de cette page :

 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; @Retention(RetentionPolicy.RUNTIME) @interface MyAnno { Ssortingng str(); int val(); } class Meta { @MyAnno(str = "Two Parameters", val = 19) public static void myMeth(Ssortingng str, int i) { Meta ob = new Meta(); try { Class c = ob.getClass(); Method m = c.getMethod("myMeth", Ssortingng.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(Ssortingng args[]) { myMeth("test", 10); } } 

Bien que toutes les réponses données jusqu’à présent soient parfaitement valables, il convient de garder à l’esprit la bibliothèque de reflections google pour une approche plus générique et plus simple de l’parsing des annotations, par exemple

  Reflections reflections = new Reflections("my.project.prefix"); Set ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class); 

En élaborant la réponse à @Cephalopod, si vous vouliez tous les noms de colonne dans une liste, vous pourriez utiliser ce oneliner:

 List columns = Arrays.asList(MyClass.class.getFields()) .stream() .filter(f -> f.getAnnotation(Column.class)!=null) .map(f -> f.getAnnotation(Column.class).columnName()) .collect(Collectors.toList());