[Java] Remplacer une classe pdt l'execution

Remplacer une classe pdt l'execution [Java] - Java - Programmation

Marsh Posté le 15-04-2004 à 22:57:16    

Bonjour, est-il possible de remplacer une classe par une autre pdt l'execution de la jvm ?
 
Par exemple, je lance une classe, j'édite le fichier .java qui lui est associé, je le recompile, et je remplace la classe initiale par la nouvelle.

Reply

Marsh Posté le 15-04-2004 à 22:57:16   

Reply

Marsh Posté le 15-04-2004 à 22:58:36    

ca s'appelle du hot redeployment. C'est possible mais il n'y a rien de prévu en standard pour faire ça à ma connaissance. La plupart des applications servers ont une implémentation cela dit.

Reply

Marsh Posté le 15-04-2004 à 23:05:21    

hot swap(swapping?), ça s'appelle quand on parle d'une classe. les debuggers un peu avancés le permettent (idea, eclipse), donc à priori c'est aussi faisable "soi meme"


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-04-2004 à 23:05:42    

cela dit, vu comment la question est posée, je soupçonne une mauvaise idée:D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-04-2004 à 23:07:08    

+1 [:joce]

Reply

Marsh Posté le 15-04-2004 à 23:08:48    

Nan nan du tout, c'est dans le cadre d'un projet permettant de simuler une pile OSI (pile réseau).
Chaque couche est implémentée dans un fichier java, qu'il est possible d'éditer et de recompiler depuis le programme.
Ce que j'aimerai, c'est ensuite intégrer cette nouvelle classe à la place de la classe initiale, pour permettre de voir en temps reel les impacts des modifs faites au code source.

Reply

Marsh Posté le 15-04-2004 à 23:10:40    

euh je ne suis pas sur de comprendre. Pq il faudrait modifier le code source?

Reply

Marsh Posté le 15-04-2004 à 23:25:51    

C'est une plateforme à destination d'étudiants.
 
Typiquement, le prof leur file une copie de la pile préalablement créée, en foutant des trous à certains endroits (là où y a des algos simples qu'il veut que les étudiants écrivent).
L'étudiant doit boucher les trous.
Donc, dans le meilleur des cas, ce serait bien de pouvoir voir en temps reel ce qui se passe à chaque compilation d'une couche, sans avoir à relancer toute la plateforme.

Reply

Marsh Posté le 15-04-2004 à 23:48:29    

the real moins moins a écrit :

hot swap(swapping?), ça s'appelle quand on parle d'une classe. les debuggers un peu avancés le permettent (idea, eclipse), donc à priori c'est aussi faisable "soi meme"

nan, ce sont des appels de l'API de debug de la JVM.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 15-04-2004 à 23:50:19    

ha oui. mais ça sert bien à ça nan?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-04-2004 à 23:50:19   

Reply

Marsh Posté le 16-04-2004 à 00:07:32    

heu uniquement à des fins de debug, la sémantique du langage, elle est pas trop faite pour ça (tu fais quoi quand une variable disparaît ?).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 16-04-2004 à 00:09:37    

Bon en effet, c'était pourtant évident que ce mécanisme serait bcp trop complexe, surtout pour un gain finalement pas si génialissime dans mon cas.
 
Merci en tout cas pour les pistes

Reply

Marsh Posté le 16-04-2004 à 00:12:06    

nraynaud a écrit :

heu uniquement à des fins de debug, la sémantique du langage, elle est pas trop faite pour ça (tu fais quoi quand une variable disparaît ?).  

euh oui, juste [:joce]
 
cela dit, on peut faire du dynamic class loading, et de la compil. j'avais d'ailleurs fait ça pour le code contest machin si je me souviens bien. mais bon, de là à dire que ça pourrait reloader une classe qui etait déjà loadée, là je sais pas


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-04-2004 à 00:14:42    

Et c'est possible de dire explicitement au class loader de "décharger" une classe ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 16-04-2004 à 00:17:10    

ptet ché pas[:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-04-2004 à 00:19:30    

the real moins moins a écrit :

euh oui, juste [:joce]
 
cela dit, on peut faire du dynamic class loading, et de la compil. j'avais d'ailleurs fait ça pour le code contest machin si je me souviens bien. mais bon, de là à dire que ça pourrait reloader une classe qui etait déjà loadée, là je sais pas

non, on peut pas faire n'importe quoi. La règle c'est qu'il faut que la classe que tu charges hérite d'un "Truc" (donc Object au minimum) et tu n'auras pas accès (statiquement) plus bas dans la hiérarchie que "Truc". Pour la simple raison que pour charger la classe qui ferait appel à la classe dynamique chargée, il faudrait charge la classe qui sera chargée dynamiquement (oui c'est tordu).
 
 
Bon, j'arrive pas à expliquer clairement, mais non, on peut pas faire n'importe quoi en chargeant dynamiquement une classe (mais on doit pouvoir faire des chaines de chargements dynamiques mais je me lance pas là-dedans).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 16-04-2004 à 00:24:31    

[:gordon shumway]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-04-2004 à 00:35:26    

R3g a écrit :

Et c'est possible de dire explicitement au class loader de "décharger" une classe ?

non, jamais (même principe que l'allocation des objets). Mais dans les JVM modernes, il existe un garbage collector de classes


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 16-04-2004 à 00:44:15    

c'est quoi ça ? (j'ai que la dernière frame des gif animés, c'est trop saoulant sinon)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 16-04-2004 à 00:45:14    

je ne sais pas trop comment le décrire. y'a que 2 frames cela dit ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-04-2004 à 10:16:31    

Bon, je pense pouvoir m'y prendre autrement puisque de toute façon, tous mes objets dynamiques héritent d'une seule et même classe
 
Couche1 extends ObjetCommunicant
 
ObjetCommunicant test1 = new Couche 1();
Donc, à l'execution je peux éditer le fichier Couche1.java, lui donner un autre nom temporaire (exemple Couche1-1564156), le compiler, le charger en utilisant Class.forName(Couche1-1564156), puis faire pointer test1 vers ce nouvel objet en le castant en ObjetCommunicant.
Class c = CLass.forName(Couche1-1564156);
test1 = (ObjetCommunicant) c.newInstance(args);
 
Faut savoir que je me fous d'avoir une perte de précision sur les objets, puisque de toute façon les objets ne communique entre eux qu'au moyen de méthodes abstraites héritées de la super classe commune.
 
C'est censé marcher ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed