Remplacer une classe pdt l'execution [Java] - Java - Programmation
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.
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"
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
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.
Marsh Posté le 15-04-2004 à 23:10:40
euh je ne suis pas sur de comprendre. Pq il faudrait modifier le code source?
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.
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.
Marsh Posté le 15-04-2004 à 23:50:19
ha oui. mais ça sert bien à ça nan?
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 ?).
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
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
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
Marsh Posté le 16-04-2004 à 00:14:42
Et c'est possible de dire explicitement au class loader de "décharger" une classe ?
Marsh Posté le 16-04-2004 à 00:17:10
ReplyMarsh Posté le 16-04-2004 à 00:19:30
the real moins moins a écrit : euh oui, juste |
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).
Marsh Posté le 16-04-2004 à 00:24:31
ReplyMarsh 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
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)
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
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 ?
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.