繁体   English   中英

如何在运行时使用 Java 调试接口从 Jar 文件加载 class

[英]How to load a class from a Jar file at runtime with the Java Debug Interface

我试图在运行时注入 ByteBuddy 代理,以防在启动 JVM 时机器上不存在 ByteBuddy(因此不在类路径中)。 我的第一个想法是将 bytebuddy 库 jar 文件添加到类路径中存在的目录中,以便在我注入代理时加载它,但我找不到检索正在运行的 JVM 的类路径的方法。 因此,我想知道是否可以在注入我的代理之前使用 Java 调试接口手动加载 JVM 中的 bytebuddy 库 jar 文件。

我尝试修改这段代码(使用 JDI),前两行转换为:

ClassType jarFileClass = (ClassType) findClassRef("java.util.jar.JarFile");
Method jarFileInit = findOverloadRef("java.util.jar.JarFile", "<init>", "java.lang.String");
Method entries = findOverloadRef("java.util.jar.JarFile", "entries", "");
ArrayList<Value> argz = new ArrayList<Value>();
argz.add(vm.mirrorOf(path)); // path is the path to the bytebuddy library jar file, as a String
ObjectReference jarFile = jarFileClass.newInstance(ev.thread(), jarFileInit, argz, ObjectReference.INVOKE_SINGLE_THREADED);
ObjectReference x = jarFile.invokeMethod(ev.thread(), entries, new ArrayList<Value>(), ObjectReference.INVOKE_SINGLE_THREADED);

其中findClassReffindOverloadRef是我自己的方法,分别获取ReferenceTypeMethod object。 可悲的是,由于java.net.URL[] class 未加载到 JVM 中,因此我无法进一步了解,因此我无法为其获取 ReferenceType。

我怎样才能追求我的追求?

通常,代理会将其所有依赖项隐藏到单个 jar 中。 这仍然可能是有问题的。 Byte Buddy 是一个相当常见的依赖项,它已经在 class 路径上,但版本不同。 为了避免这种情况,许多代理将它们的依赖关系隐藏到不同的名称空间中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM