J'ai un agent java qui instruments bytecode. J'utilise l'API de java 6 pour permettre aux utilisateurs de charger dynamiquement l'agent et le code d'instrument et de deinstrument en utilisant mon agent java. J'utilise l'attribut de manifeste Boot-Class-Path pour m'assurer que mes classes javagent sont dans le chemin de classe de démarrage afin que mes utilisateurs puissent instrumenter des classes telles que ArrayList, etcJavaagent classe déchargement
Cependant, le problème vient du versionnage. Supposons qu'un utilisateur attache dynamiquement la version 1 de mon agent. Puis je lui ai donné la version 2. Maintenant que son serveur d'applications ne s'est jamais arrêté depuis qu'il a attaché la version 1 de mon agent, les classes de la version 1 sont toujours chargées.
J'ai besoin d'un moyen tel que lorsque la version 2 de mon client javaagent, la version 1 est déchargée.
Je sais que l'une des façons serait d'écrire un classloader client pour les classes de mon javaagent, et de définir la référence du classloader sur null. Cependant, dans ce cas, je ne pourrai pas classer les classes dans le classpath boot puisque mon classloader sera dans la hiérarchie du classloader de démarrage et donc mes utilisateurs ne peuvent pas classer des classes comme ArrayList car j'ajoute un appel dans ArrayList méthodes de classes de mon agent le chargeur de classe de démarrage ne sera pas en mesure de les voir.
Alors, existe-t-il un moyen de résoudre le problème du chemin d'accès au démarrage et de toujours décharger les classes de l'agent précédent?
Vous pourriez jeter un oeil à JavaRebel (http://www.zeroturnaround.com/javarebel/), qui est une implémentation commerciale de ce que vous essayez de faire. Cela pourrait vous donner une indication de ce qui est ou n'est pas possible. – skaffman