Comment trouver des méthodes annotées dans un package donné?
J'ai un simple marqueur d'annotation pour les méthodes (similaire à la première exemple à l'Article 35 dans Efficace Java (2e éd)):
/**
* Marker annotation for methods that are called from installer's
* validation scripts etc.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InstallerMethod {
}
Puis, dans un package donné (disons com.acme.installer
), qui a un peu sous-paquets contenant des 20 classes, je voudrais trouver toutes les méthodes annotées avec elle. (Parce que j'aimerais faire quelques vérifications concernant toutes les méthodes annotées dans un test unitaire.)
Quel est le moyen le plus facile de faire cela? De préférence sans l'ajout de nouveau 3ème partie les bibliothèques ou les cadres.
Modifier: pour clarifier, évidemment method.isAnnotationPresent(InstallerMethod.class)
sera le moyen de vérifier si une méthode a l'annotation - mais ce problème consiste notamment à trouver toutes les méthodes.
- Vérifier stackoverflow.com/questions/520328/...
- Hmm, ouais, je suppose que cela revient à remettre en question (qui je l'ai demandé en février). 😛 Mais attendu que le droit de réponse a été "non, il ne peut être fait à l'aide de la réflexion", ici, la question est de savoir comment trouver annoté méthodes plus facilement, en utilisant tous les moyens...
- Parce que la partie la plus difficile ici n'est pas vraiment liée à des annotations (mais de trouver des classes de colis), cette question n'est pas aussi pertinente que je ne le pensais. :/ Bon, peut-être que cela pourrait aider quelqu'un à interroger à propos de la même chose...
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez mettre en place vous-même, ces méthodes trouverez toutes les classes dans un package donné:
Alors vous pouvez simplement le filtre sur ces classes d'annotation:
Vous devriez probablement prendre un coup d'oeil à l'open source Les réflexions de la bibliothèque. Avec elle, vous pouvez facilement obtenir ce que vous voulez avec quelques lignes de code:
Reflections reflections = new Reflections( new ConfigurationBuilder().setUrls( ClasspathHelper.forPackage( "com.acme.installer" ) ).setScanners( new MethodAnnotationsScanner() ) );
Si vous êtes heureux d'utiliser le Printemps, alors que quelque chose le long de ces lignes à l'aide de son context:component-scan de la fonctionnalité, où le Printemps des scans pour annoté classes dans un package donné. Sous les couvertures, c'est assez horrible, et implique d'arrachage sur le système de fichiers et les fichiers JAR à la recherche pour les classes dans le package.
Même si vous ne pouvez pas utiliser le Printemps directement, après avoir jeter un oeil par le biais de son code source peut vous donner quelques idées.
Certes, la réflexion Java APi n'est d'aucune utilité ici, mais il ne fournit pas un moyen pour obtenir toutes les classes dans un package.