Comment charger une classe qui implémente une interface à partir d'un fichier JAR au moment de l'exécution?
-
12-11-2019 - |
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?
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