我有一个检测字节码的 java 代理。我正在使用 java 6 中的附加 api 来允许用户使用我的 java 代理动态加载代理和仪器以及 deinstrument 代码。我正在使用 Boot-Class-Path 清单属性来确保我的 javagent 类位于引导类路径中,以便我的用户可以检测 ArrayList 等类。
但是,问题来自版本控制。假设用户动态附加了我的代理的版本 1。然后我给了他第 2 版。现在,自从他附加了我的代理的第 1 版后,他的应用服务器从未关闭过,所以第 1 版的类仍在加载。
我需要一些方法,以便当我的 javaagent 客户端版本 2 时,版本 1 被卸载。
我知道一种方法是为我的 javaagent 的类编写一个客户类加载器,并将类加载器引用设置为 null。但是在这种情况下,我将无法在引导类路径中检测类,因为我的类加载器将位于引导类加载器的层次结构中,因此我的用户无法检测像 ArrayList 这样的类,因为如果我在 ArrayList 的方法中添加一个调用到我的一个代理类的方法,引导类加载器将无法看到它们。
那么有什么办法可以解决引导类路径问题,并且仍然卸载以前代理的类吗?