Comment obtenir des annotations de méthodes d’interface ou de classes abstraites en Java

J’ai une interface comme celle-ci:

public interface IFoo{ @AnnotationTest(param="test") Ssortingng invoke(); } 

et j’implémente ceci comme ceci:

 public class Foo implements IFoo{ @Override public Ssortingng invoke(){ Method method = new Object() { }.getClass().getEnclosingMethod(); AnnotationTest ann = method.getAnnotation(AnnotationTest.class); if(ann == null){ System.out.printl("Parent method's annotation is unreachable...") } } } 

S’il est possible d’atteindre l’annotation du parent, je veux en apprendre le chemin.

Toute aide ou idée sera appréciée.

Vous pouvez utiliser Spring AnnotationUtils.findAnnotation pour lire des annotations à partir d’interfaces.

Exemple :

Interface I.java

 public interface I { @SomeAnnotation void theMethod(); } 

Classe d’implémentation A.java

 public class A implements I { public void theMethod() { Method method = new Object() {}.getClass().getEnclosingMethod(); SomeAnnotation ann = AnnotationUtils.findAnnotation(method, AnnotationTest.class); } } 

Cela nécessite évidemment d’inclure dans votre projet (et votre importation) les classes du framework Spring.

vous ne pouvez pas hériter d’annotations.

Mais un framework qui utilise une annotation peut vérifier si une annotation est présente sur la superclasse

Il n’y a pas de moyen direct pour l’obtenir. Si vous avez réellement besoin, vous devez effectuer une boucle manuelle sur getInterfaces() pour rechercher si une interface implémentée contient l’annotation. Si vous souhaitez rechercher des superclasses (éventuellement abstraites) et que l’annotation n’est pas @Inherited , vous pouvez à nouveau effectuer une itération sur la chaîne de la superclasse jusqu’à la recherche de Object (*).

Mais attention, en tant qu’états post suivants, il y a de bonnes raisons pour que cela ne soit pas directement implémenté en Java: Pourquoi les classes java n’héritent pas des annotations des interfaces implémentées?

(*) Si l’annotation est @Inherited , la recherche est effectuée automatiquement sur les superclasses, mais pas sur les interfaces.