【发布时间】:2009-08-08 05:39:45
【问题描述】:
我有一个检测字节码的 java 代理。 我正在使用 java 6 中的附加 api 来允许用户使用我的 java 代理动态加载代理和仪器并取消仪器代码。 我正在使用 Boot-Class-Path 清单属性来确保我的 javagent 类位于引导类路径中,以便我的用户可以检测 ArrayList 等类。
但是问题在于版本控制。 假设用户动态附加了我的代理的版本 1。 然后我给了他第 2 版。现在,自从他附加了我的代理的第 1 版后,他的应用服务器从未关闭过,所以第 1 版的类仍在加载。
我需要一些方法,以便当我的客户端版本 2 的 javaagent 被卸载时,版本 1 被卸载。
我知道一种方法是为我的 javaagent 的类编写一个客户类加载器,并将类加载器引用设置为 null。 但是,在这种情况下,我将无法在引导类路径中检测类,因为我的类加载器将位于引导类加载器的层次结构中,因此我的用户无法检测像 ArrayList 这样的类,因为如果我在 ArrayList 的方法中添加一个调用到我的一个代理类的方法,引导类加载器将无法看到它们。
那么有什么办法可以解决引导类路径问题,并且仍然卸载之前代理的类?
【问题讨论】:
-
您可能想看看 JavaRebel (zeroturnaround.com/javarebel),它是您正在尝试做的事情的商业实现。它可能会让你知道什么是可能的,什么是不可能的。
标签: java classloader javaagents