识别“方法代码太大”的来源

identifying ``method code too large`` origin

所以我运行进入了

MY: WARNING cannot transform class XYZ
java.lang.RuntimeException: Method code too large!
    at org.objectweb.asm.MethodWriter.a(Unknown Source)
    at org.objectweb.asm.ClassWriter.toByteArray(Unknown Source)
    at ...

我知道 Method code too large! exception using ASM and of the project it links to

但是,我已经获得了可以使用的 ASM 修改版本,因此,使用该项目并不是一个真正的选择。

这将需要我手动分解违规方法。值得庆幸的是,只有一个库 class(到目前为止 -.-)发生了这种情况,所以它应该是可管理的。

不过,我想检测并报告太大的方法。所以我可以更轻松地确定我必须拆分的内容。 (坦率地说,我不明白为什么默认情况下不提供此信息。)

已经写了一个MethodVisitor,它将所有超级调用包装在try-catch块中,并且异常捕获报告正在处理的方法,但因为它是ClassWritertoByteArray方法报错,用于遍历字节码的MethodVisitor是作为局部变量创建的,我还没想好怎么插入。无法覆盖 toByteArray 方法,因为它似乎访问 class-private 字段并且只是复制失败,因为我也非常需要复制包的其余部分。

我还没有尝试检测 ClassWriter 本身,但是在去那里之前,我想知道是否有更合理的方法来找出哪个方法太大。

仅供参考,this commit 添加了一个包含此信息的新异常。 6.2.1 已随提交发布。