Comment charger une classe qui implémente une interface à partir d'un fichier JAR au moment de l'exécution?

StackOverflow https://stackoverflow.com/questions/9433003

Question

Je souhaite implémenter une application qui pourrait utiliser des classes implémentées par les utilisateurs. Chaque classe doit être implémentée une interface que je définis les interfaces et, enfin, toutes les classes implémentées par un utilisateur, archivées dans un fichier JAR. Les utilisateurs copient les fichiers JAR sur le chemin de la classe, puis ne donnent le nom du fichier JAR que à mon application. Mon application devrait être en mesure de charger le fichier JAR dynamiquement. Pour faire ça, j'ai trouvé ce post C'est très utile, mais il charge les classes par des noms de classe. Je veux charger des cours en fonction de leurs parents.

public class A implements iA {
    @Override
    int getAValue() { ... }
}

public class B implements iB {
     @Override
     int getBValue() { ... }
}

Supposons que le fichier JAR chargé a les deux A et B Des classes. Je veux obtenir une instance de la classe B en connaissant le iB Nom de l'interface.

Que devrais-je faire?

Était-ce utile?

La solution

Vérifiez ce message: Trouver des classes Java implémentant une interface

Il parle de la solution à ce que vous voulez.

Je sais que ce que je vais suggérer n'est pas le moyen le plus léger de le faire, mais vous venez de décrire l'un des cas d'utilisation fondamentale pour une architecture de plugin en Java et la réussite d'Osgi.

Je suggère d'utiliser quelque chose de léger comme Apache Felix, de faire le pot que l'utilisateur fournit implémenter un simple osgi.bundleactivator et d'enregistrer l'implémentation de votre interface en tant que service OSGI. (Ce n'est qu'une carte de hachage sophistiquée et rien à voir avec les services de repos ou similaires).

Ensuite, vous pouvez simplement obtenir toutes les implémentations d'une interface donnée. C'est assez simple. Vous pouvez consulter la documentation Felix ici: http://felix.apache.org/site/apache-delix-framework-lanching-and-embedding.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top