2010-10-30 35 views
2

Je veux rendre l'initialisation de mon programme un peu plus "intelligente".Comment trouver toutes les implémentations d'une certaine interface?

J'ai plusieurs classes qui représentent des commandes. Toutes ces classes sont immuables (c'est-à-dire que la création d'une seule instance de chacune doit être suffisante pour l'ensemble de l'application). Toutes ces classes implémentent l'interface Command. Je pense que le fait que certaines classes soient placées dans le même pot avec une classe avec la méthode principale (peut-être même dans un paquet prédéfini) et que ces classes implémentent une interface connue devrait donner suffisamment d'informations pour permettre automatiser la création de leurs instances.

Comment puis-je implémenter cette fonctionnalité? (Évidemment, c'est quelque chose de étroitement lié à la réflexion, et peut-être, avec les mécanismes de chargement de classe Java, mais je ne suis pas un expert dans ces domaines).


Je veux avoir quelque chose comme ceci:

public static void init() { 
    ... 
    Map<String, Command> commands = Maps.newHashMap(); 
    for (Class clazz : findCommandImplementationsInThisJarFile()) { 
     //some try/catch stuff is ommited 
     Command command = clazz.newInstance(); 
     commands.put(command.getName(), command); 
    } 
    ... 
} 

Comment implémenter la méthode délicate findCommandImplementationsInThisJarFile()?

Répondre

2

Vous devez extcos:

select(javaClasses()).from("your.package").returning(allAnnotatedWith(YourAnnotation.class))

prend également en charge thoseImplementing et thoseExtending etc ...

Voir: http://sourceforge.net/projects/extcos/

Spring contient également un code similaire pour son analyse composant qui est facilement adapté .

+0

Cool! J'aime ça. Il a des fonctionnalités nécessaires, simple d'utilisation, et (j'en suis presque sûr) ça va être très intéressant d'étudier l'implémentation (car je ne sais pas encore comment faire les mêmes choses moi-même). – Roman