java 運行時動態(tài)修改classpath添加外部jar

百度上的方法最多是破壞封裝性的直接通過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,如果是文件夾就自己壓縮一下

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容