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