首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在加载类字节码之前操纵它?

如何在加载类字节码之前操纵它?
EN

Stack Overflow用户
提问于 2019-06-29 15:10:57
回答 1查看 146关注 0票数 2

我正在试图找到一种在加载类之前操纵类的字节码的方法(在运行时)。我需要这样做,因为操作依赖于在main之前(并且可能在加载subject类之前)不存在的东西。

我已经看过java代理了。premain方法在这里显然不适用,因为它是在main之前执行的,这意味着它不能依赖于在main中设置的东西。另一种选择似乎是agentmainmanually loading the agent at runtime。现在的问题是,在较新的版本(9+)中,所需的依赖项(tools.jar)似乎不再存在。

现在,我想知道在运行时的某个特定点或在类加载之前操作字节码的最佳方法是什么,以及在Java9+中是否仍然可以这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-29 16:45:45

premain方法在这里显然不适用,因为它是在main之前执行的,这意味着它不能依赖于在main中设置的东西

这不是真的。代理不需要在代理加载时立即修改类字节码。它可以注册ClassFileTransformer并将字节码操作推迟到稍后加载目标类。或者,代理可以简单地保存Instrumentation实例,以便在任何方便的时间使用。

在较新的版本(9+)中,所需的依赖项(tools.jar)似乎不再存在。

这也是不完全正确的。附加API存在于所有新版本的JDK中。由于JDK 9不再需要tools.jar,而是属于jdk.attach模块。

为了便于在运行时附加,可以使用byte-buddy-agent或独立的jattach实用程序。两者都与JDK 8以及JDK 9+一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56818607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档