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

从内存中获取Java类字节码(经过多次转换),java,transform,bytecode,Java,Transform,Bytecode,我正在为Minecraft开发一个coremod,并在加载时转换很多类。 然而,问题是,有多个coremods也转换了与我相同的类,我得到了一些奇怪的行为,我想研究一下 接下来的问题是,在字节码被多次转换之后,我如何检查它? 当我转换它时,我只得到一个byte[]输入,通过ASM运行,然后返回修改过的字节码 我的想法是在类加载后将类字节码转储到.class文件中,并从那里检查它。但我似乎找不到任何方法在类加载后实际获取字节码。 我能找到的最接近的是getResource,但它返回的字节码与转换前

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

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

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

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

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


希望有人能帮我做这个=)

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

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

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

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

转换是如何进行的?通常你会使用Java代理来实现这一点。据我所知,我所连接的代码已经在这样做了,我只需要提供一个转换器:“@Override public byte[]transform(String name1,String name2,byte[]bytedata)”我真的不能对此进行任何更改(Forge Mod Loader)因此,我希望有一种方法,而不是代理获取字节码=/不幸的是,没有。我可以转储转换后的字节码,问题是有转换在我的字节码之后运行,我希望在完成这些操作后访问最终的字节码。我想我只需要深入研究加载我代码的代理的代码。再次注册你的转换器。哦,这主意不错,那么我注册的转换器应该是最后一个=D