web-dev-qa-db-fra.com

Java - Chargement de classes annotées

Je sais qu'il y a un ensemble incroyable d'outils pour charger des cours de plug-in en Java, mais aujourd'hui une idée est venue à mon esprit.

Et si j'ai un tas de classes annotées et non annotées dans le paquet "org.home.junk" (annoté avec annotation "@annotedclass") et ces classes ont des méthodes annotées avec Annotation "@annoteateMethod".

PREMIER QUESTION: Puis-je au moment de l'exécution d'obtenir un tableau/collection de toutes les classes de ce paquet spécifique, afin que je puisse vérifier lequel est annoté et créer une instance d'entre eux. (Je suis cependant conscient, mais comment vérifier si un certain.class a des annotations de la permission de ce guide: http://isagoksu.com/2009/development/java/création-custom-annotations-Anking-utilisateur-fof -Hem / )

Deuxième question: - Si je peux faire ce que j'aimerais dans la première question - quelle serait la façon la plus politique de faire cela?

Je crois que cela est possible, car je comprends bien les classes de test de test Junit chargent de manière similaire.

De plus, ce serait cool si cela pouvait être fait avec des bibliothèques de tiers minimes et une fois, à nouveau - si c'est possible :)

23
Xeperis

Première réponse: Jetez un coup d'œil à ce projet .

Reflections reflections = new Reflections("org.home.junk");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);

Il renvoie toutes les classes de org.home.junk annoté avec javax.persistence.Entity Annotation.

Deuxième réponse: Pour créer une nouvelle instance de classes ci-dessus, vous pouvez le faire.

for (Class<?> clazz : annotated) {
    final Object newInstance = clazz.newInstance();
}

J'espère que cela répond à tout.

28
Kowser

Cela peut être fait avec des techniques qui vérifient le système de fichiers car il s'agit davantage d'une émission de classes de classe inférieure à celle d'une réflexion. Vérifiez ceci: Pouvez-vous trouver toutes les classes dans un paquet à l'aide de la réflexion? .

Si vous pouvez vérifier tous les fichiers de classe existants dans un répertoire, vous pouvez facilement obtenir la classe correspondante à l'aide de cette méthode.

Class<?> klass = Class.forName(className)

Pour savoir si une classe est annotée ou non un problème de réflexion. Obtenir les annotations utilisées dans une classe est effectuée de cette façon:

Annotation[] annotations = klass.getAnnotations();

Assurez-vous de définir votre annotation personnalisée avec un type de stratégie de rétention visible au moment de l'exécution.

@Retention(RetentionPolicy.RUNTIME) 

Cet article est une bonne ressource pour plus d'informations sur cela: http://tatudials.jenkov.com/java-réflection/annotations.html .

2
gersonZaragocin

Tout dépend de quel type d'exigence avez-vous pour l'annotation.

Comme par exemple @EJB: Cette annotation est conçue pour que le conteneur identifie et effectue des travaux spécifiques EJB qui nécessitent la numérisation via des fichiers, puis de trouver de telles classes.

Toutefois, si votre exigence est uniquement d'activer des fonctionnalités spécifiques basées sur l'annotation, vous pouvez le faire en utilisant Java reflet uniquement

par exemple. @NotNull: Cette annotation est conçue dans JSR 303 pour vérifier que l'élément annoté n'est pas nul. Cette fonctionnalité peut être facilement mise en œuvre au moment de l'exécution à l'aide de l'API de réflexion.

1
Amit Deshpande

Si vous avez le printemps (tiers, désolé :-)), utilisez le org.springframework.context.annotation.classpathscanningcandidateComponentProvider

Un exemple d'utilisation de code peut être trouvé dans ceci SO QUESTION

1
Vitaliy