微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在运行时从JVM提取类文件

如何解决如何在运行时从JVM提取类文件

我在JVM上运行了一个Jar应用程序。该应用程序在运行时会下载其他.class文件。这些被加载到应用程序的内存中(我通过进行堆和线程转储进行了验证)。我想提取文件并反编译它们以查看发生了什么。

有人知道有什么工具可以保存Jar的确切当前状态,然后从JVM对其进行反编译或反编译(或提取.class文件)?

解决方法

使用JVMTI接口,您可以创建所谓的代理。对于实际上传递到类加载器进行加载的每个类文件,将调用它们,此时您可以选择保存它。

正常使用主应用,但它不是psv main(String[]),而是public static void premain(String args,Instrumentation instrumentation) {}

用一个罐子就像制作一个普通的Java可运行罐子一样,除了清单Main-Class以外,它是Premain-Class

以代理(java -javaagent:yourjar.jar -therestofyouroptionsasnormal的身份启动它,您的premain将在实际main之前被调用一次。然后,在您如此获得的Instrumentation实例上,调用addTransformer,传入您编写的ClassFileTransformer的实现实例。该转换器实际上不会进行任何转换,但是将调用其transform方法,让您目睹正在加载的类文件。例如,将它们保存到目录中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。