У меня есть java-агент, который обрабатывает байт-код. Я использую API прикрепления в Java 6, чтобы пользователи могли динамически загружать агент и код инструмента и деинструмента с помощью моего агента Java. Я использую атрибут манифеста Boot-Class-Path, чтобы убедиться, что мои классы javagent находятся в пути к классам загрузки, чтобы мои пользователи могли использовать такие классы, как ArrayList и т. д.
Однако проблема связана с версиями. Допустим, пользователь динамически подключает версию 1 моего агента. Затем я дал ему версию 2. Теперь, поскольку его сервер приложений никогда не отключался с тех пор, как он подключил версию 1 моего агента, классы версии 1 все еще загружены.
Мне нужен какой-то способ, чтобы когда моя клиентская версия 2 javaagent выгружалась версии 1.
Я знаю, что одним из способов было бы написать клиентский загрузчик классов для моих классов javaagent и установить для ссылки на загрузчик классов значение null. Однако в этом случае я не смогу инструментировать классы в загрузочном пути к классам, так как мой загрузчик классов будет ниже в иерархии от загрузчика классов загрузки, и поэтому мои пользователи не смогут инструментировать классы, такие как ArrayList, потому что, если я добавлю вызов внутри методов ArrayList к одному из моих методы классов агента, загрузчик классов загрузки не сможет их увидеть.
Итак, есть ли способ решить проблему с загрузочным классом и при этом выгрузить классы предыдущего агента?