2009-12-02 4 views
1

Cela fonctionne bien pour filtrer les méthodes avec l'annotation Analyze:Java Reflection: Nombre de méthodes avec une annotation?

for (Method m : ParseTree.class.getMethods()) { 
     if (m.isAnnotationPresent(Analyze.class)) { 

si je veux juste un compte, sans bouclage? Existe-t-il une méthode qui retourne combien de méthodes dans une certaine classe ont une certaine annotation?

Répondre

3

C'est un cas d'utilisation très spécial, donc je doute vraiment, il y a une méthode dans l'API de réflexion de Java.

Mais même s'il y avait une telle méthode, il serait tout simplement faire la même chose: toutes les méthodes itérer sur d'une classe, compter les annotations et le rapport du nombre.

Je vous suggère de simplement implémenter une méthode statique dans une classe d'utilitaire pour cette tâche.

public static int countAnnotationsInClass(Class<?> testClass, Class<?> annotation) { 
    // ... 
} 
+0

Oui, la vraie question est: Pourquoi ?? –

1

annotations Java avec la rétention d'exécution (c'est ceux que vous pouvez obtenir grâce à la réflexion) ne sont accessibles directement à partir de l'élément sur lequel l'annotation est présente. Donc, vous allez devoir parcourir les méthodes et vérifier les annotations comme dans votre exemple.

Si vous devez faire beaucoup de traitement des annotations au niveau de la classe, je vous suggère de créer une classe utilitaire qui fait cela:

public class AnnotationUtils { 
    public static int countMethodsWithAnnotation(Class<?> klass, 
               Class<?> annotation) { 
     int count = 0; 
     for (Method m : klass.getMethods()) { 
      if (m.isAnnotationPresent(annotation)) { 
       count++; 
      } 
     } 
     return count; 
    } 

    // Other methods for custom annotation processing 

} 

Vous pouvez ensuite utiliser la classe utilitaire pour obtenir l'information que vous voulez dans un appel de méthode comme vous avez besoin dans le reste de votre code:

int count = AnnotationUtils.countMethodsWithAnnotation(ParseTree.class, 
                 Analyze.class); 
Questions connexes