Bonjour,
Dans le cadre d'un projet d'étude j'ai a développer deux applications qui doivent communiquer entre elles grâce a des instances sérialisées.
Pour bien faire j'ai séparé tous les beans traversant le réseau dans une librairie. Le problème est que si l'une des deux applications n'utilise des version légèrement différentes de la lib, la désérialisation provoquera une exception puisque la définition des classes sera différente. Pour résoudre ce problème j'ai choisi de mettre cette lib accessible via une URL sur le web, et charger dynamiquement au démarage le .jar
J'ai donc le code suivant (utilisant pour les test un fichier local) :
Mon problème est que les instances de ces classes sont présente très régulièrement dans l'application, et que passer systématiquement pas des fonction callback deviendra rapidement lourd.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 File f = new File("C:/libmt.jar"); URL[] urls = {f.toURL()}; ClassLoader loader = new URLClassLoader(urls); Class c = Class.forName("beans.Token", true, loader); Object o = c.newInstance(); Method m = c.getMethod("getVersion"); System.out.println(m.invoke(o));
Ce qui résolverais mon preblème serait de ceci :
J'ai pensé a passer par une Factory qui me retournera une instance, mais ca restera toujours une instance d'Object, et je devrais toujours passer par des callbacks.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 File f = new File("C:/libmt.jar"); URL[] urls = {f.toURL()}; ClassLoader loader = new URLClassLoader(urls); Class c = Class.forName("beans.Token", true, loader); Token t = (Token) c.newInstance(); // Sauf que le type Token n'éxiste pas ... t.getVersion();
J'ai pensé aussi à passer par une interface implémenté par tous les beans du .jar, je pourais alors caster mon Object, sauf que ca ne m'apportera pas plus de méthodes accessibles.
Pour finir j'ai remarqué l'existence de l'interface Future, je ne sais pas si ca répondrais a mon problème et je ne suis pas arrivé a la mettre en place ...
Je suis donc plus ou moins entrain de me dire que la solution sera de récup le .jar et relancer l'application (à la windows).
PS : ne serait-il pas possible de préciser a System d'utiliser une classeloader de plus ?
merci d'avance.
Partager