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

时间:2014-02-28 03:42:01

标签: java transform bytecode

我正在为Minecraft开发一个coremod,并在加载时转换很多类。 然而问题是有多个coremod也会改变我所使用的相同类,并且我得到一些我想要研究的奇怪行为。

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

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

TLDR: 如何在修改和加载类之后获取类的字节码? - 不要使用ClassLoader.getResource,因为它返回未修改的版本。 - 在加载期间不能得到它,因为我想在我自己之后发现变换。

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

希望有人可以帮我这个=)

1 个答案:

答案 0 :(得分:1)

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

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

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

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