我正在为Minecraft开发一个coremod,并在加载时转换很多类。 然而问题是有多个coremod也会改变我所使用的相同类,并且我得到一些我想要研究的奇怪行为。
然后出现了问题,如何在多次转换后检查字节码? 当我转换它时,我只得到一个byte []输入,我通过ASM运行然后返回我修改过的字节码。
我的想法是在加载类之后将类字节码转储到.class文件,然后从那里检查它。但是在加载类之后,我似乎无法找到任何实际获取字节码的方法。 我能找到的最接近的是getResource,但它返回的字节码就像它被转换之前一样,而不是我想要的。
TLDR: 如何在修改和加载类之后获取类的字节码? - 不要使用ClassLoader.getResource,因为它返回未修改的版本。 - 在加载期间不能得到它,因为我想在我自己之后发现变换。
是否有一些可以转储内存中字节码的外部程序?
希望有人可以帮我这个=)
答案 0 :(得分:1)
据我所知,Java代理提供了运行时访问字节码的唯一接口。这也是你首先创建类文件转换器的方法,所以你应该已经使用了一个。只需修改它就可以转储类文件。
编辑:就转换的顺序而言,根据文档,它是
Retransformation incapable transformers
Retransformation incapable native transformers
Retransformation capable transformers
Retransformation capable native transformers
理想情况下,你需要一个具有转换功能的原生变换器。但编写本机代码很痛苦。将变换器设置为启用重新转换将有很大帮助,但是稍后注册的另一个重新转换器仍然可以在您之后运行。我能想到的最佳选择是再次注册您的代理商。或者找到所有注册变压器的电话,然后插入你的电话。