Java

java 运行时动态修改classpath添加外部jar

2019-08-05  本文已影响2人  yangganboy

破坏封装性的直接通过setAccessible加jar url的方法我就不介绍了。简单暴力,但是破坏了封装性,jdk版本随便改一下,可能就挂了。

我这个介绍一个优雅的修改方法,利用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参数

-javaagent:.\target\classes\agent.jar(zip文件路径)

这里以eclipse为例

然后只要启动,就可以通过在项目里通过这个Class获得Instrumentation了

之后只要用这个class操作就行了

上一篇下一篇

猜你喜欢

热点阅读