百度上的方法最多是破壞封裝性的直接通過setAccessible加jar url。setAccessible 簡單暴力,但是破壞了封裝性,jdk版本隨便改一下,可能就掛了。
還有一種方法是通過urlclassloader類,手動管理jar。但是這種方法會導致agent失效,從而導致程序無法正常運行。
Instrumentation 方法
最完美的方法是利用java agent的Instrumentation接口的appendToSystemClassLoaderSearch方法。
我找了很久才找到這個方法,線索是AppClassLoader的appendToClassPathForInstrumentation方法。
在項目里新建一個類
import java.lang.instrument.Instrumentation;
public class InstrumentationHolder {
public static Instrumentation instrumentation;
public static void premain(String agentOps, Instrumentation inst)? {
? ? instrumentation = inst;
}
}
把這個編譯好的class按包名目錄添加到一個zip中
然后在壓縮包里添加META-INF/MANIFEST.MF文件
內容為
Manifest-Version: 1.0
Premain-Class: org.tomorrow.InstrumentationHolder
Can-Redefine-Classes: true
Premain-Class為之前新建的類名
然后可以把jar放到項目的資源目錄
然后在IDE里面添加jvm參數(shù)
-javaagent:.\target\classes\agent.jar(zip文件路徑)
這里以eclipse為例

然后只要啟動,就可以通過在項目里通過這個Class獲得Instrumentation了
之后只要用這個class操作就行了
Instrumentation只能加入jar,如果是文件夾就自己壓縮一下