从内存中获取Java类字节码(经过多次转换)

2024-05-06

我正在为 Minecraft 开发一个 coremod,并在加载许多类时对其进行转换。 然而问题是,有多个 coremod 也转换了与我相同的类,并且我遇到了一些我想研究的奇怪行为。

那么问题来了,经过多次转换后的字节码如何检查呢? 当我转换它时,我只得到一个 byte[] 输入,我通过 ASM 运行该输入,然后返回修改后的字节码。

我的想法是在类加载后将类字节码转储到 .class 文件,并从那里检查它。但我似乎找不到任何方法来在类加载后实际获取字节码。 我能找到的最接近的是 getResource,但它返回的是转换之前的字节码,而不是我想要的。

总括: 如何在修改和加载类后获取该类的字节码? - 无法使用 ClassLoader.getResource,因为它返回未修改的版本。 - 在加载期间无法获取它,因为我想捕获在我自己之后发生的转换。

是否有一些外部程序可以转储内存中的字节码或其他东西?

希望有人能帮助我解决这个问题=)


据我所知,运行时访问字节码的唯一接口是由 Java 代理提供的。这也是您首先创建类文件转换器的方式,因此您应该已经在使用它了。只需修改它即可转储类文件。

编辑:就转换顺序而言,根据文档,它是

Retransformation incapable transformers
Retransformation incapable native transformers
Retransformation capable transformers
Retransformation capable native transformers

因此,理想情况下,您需要一个具有重新转换能力的本机变压器。但编写本机代码是一件痛苦的事情。设置你的转换器以启用重新转换将会有很大帮助,但是稍后注册的另一个重新转换器仍然有可能在你之后运行。我能想到的最佳选择是重新注册您的代理。或者找到所有注册变压器的调用,然后插入你的变压器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从内存中获取Java类字节码(经过多次转换) 的相关文章

随机推荐