387 votes

Comment dois-je charger pots dynamiquement pendant l’exécution ?

Pourquoi est-il si difficile de le faire en Java? Si vous voulez avoir tout type de module de système, vous devez être en mesure de charger les pots de façon dynamique. Je me suis dit y a un moyen de le faire en écrivant votre propre chargeur de classe, mais c'est beaucoup de travail pour quelque chose qui devrait (dans mon esprit au moins) être aussi simple que d'appeler une méthode avec un pot de fichier comme argument.

Des suggestions pour un simple code qui fait cela?

P. S.: je sais que certains le voient comme boiteux pour répondre à vos propres questions, mais j'ai pensé que je ferais ça ce qui permet une meilleure on pourrait remonter jusqu'passé.

314voto

jodonnell Points 14999

La raison pour laquelle qu'il est difficile est la sécurité. Chargeurs de classes personnalisées sont censés être immuable ; vous ne devrait pas être en mesure d’ajouter bon gré mal gré des classes à elle lors de l’exécution. Je suis vraiment très surpris qui fonctionne avec le chargeur de classes système. Voici comment faire votre propre classloader enfant :

Douloureux, mais ça y est.

151voto

Allain Lalonde Points 28717

J’ai trouvé cette solution un peu en arrière, mais c’est tellement hackers que je suis un peu gêné de le poster ici, car il utilise la réflexion afin de contourner l’encapsulation.

Mais... Il fonctionne parfaitement.

51voto

Martin Klinke Points 4157

Vous devriez jeter un oeil à OSGi, par exemple mis en œuvre dans la Plate-forme Eclipse. Il fait exactement cela. Vous pouvez installer, désinstaller, démarrer et arrêter ce qu’on appelle des faisceaux, qui sont effectivement des fichiers JAR. Mais il fait un peu plus, car il offre par exemple des services qui peuvent être découverts dynamiquement dans des fichiers JAR lors de l’exécution.

Ou consultez la spécification pour le Java Module System.

44voto

Chris Points 4552

Qu’en est-il du cadre de JCL classe loader? Je dois admettre, je n’ai pas utilisé, mais il semble prometteur.

exemple d’utilisation :

19voto

Jonathan Nadeau Points 121

Voici une version qui n’est pas obsolète. J’ai modifié l’original pour supprimer la fonctionnalité désapprouvée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X