3 votes

Le rechargement dynamique des classes ne fonctionne qu'en mode débogage, pourquoi/comment cela fonctionne-t-il vraiment ?

J'ai une question délicate à poser.

Mon programme Java fait ce genre de choses en boucle :

boucle :

  1. lire un fichier externe contenant une classe Java compilée dans un tableau d'octets[].

  2. créer une nouvelle instance de mon propre classloader.

  3. setbytes du fichier lu à cette instance de classloader.

  4. à l'aide du classloader créé, créer une nouvelle instance de l'objet de la classe à partir d'un fichier externe.

  5. appeler n'importe quelle méthode de l'objet créé.

Et c'est là que le bât blesse.

  1. Lorsque j'exécute ce programme en mode débogage, il se comporte comme je m'y attendais : si le fichier externe a changé, le classloader charge la nouvelle version de la classe et l'exécute (si le fichier n'a pas changé, il charge également l'ancienne version, bien entendu).

  2. Mais lorsque j'exécute ce programme PAS en mode débogage, il exécute toujours l'ancienne version malgré le fait que le fichier lu a changé.

Peut-être que quelqu'un ayant une connaissance plus approfondie des problèmes de classloading et des comportements de la JVM peut m'expliquer ce comportement.

1voto

Rajesh J Advani Points 2503

Voici une version simplifiée de ce qui se passe :

  1. La JVM charge les classes et autres ressources dans le chemin de classe une seule fois (sauf en mode débogage) à partir des répertoires ou des fichiers Jars spécifiés dans la variable d'environnement CLASSPATH.
  2. Pour ce faire, il utilise les ClassLoaders
  3. Une fois qu'une ressource a été chargée par une instance de ClassLoader, elle reste en mémoire jusqu'à ce que le ClassLoader soit ramassé.

Le mode debug est un mode spécial fourni par la JVM, et le classloader travaille plus dur pour vous donner la dernière version de la ressource.

0voto

Grims Points 712

Il n'est pas possible de recharger la même classe avec le même chargeur de classe.

vous pouvez trouver un article bien écrit sur le rechargement dynamique des classes aquí

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