gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:08 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

关于java - 从内存中获取Java类字节码(经过多次转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com