【发布时间】:2018-01-08 14:07:05
【问题描述】:
所以我遇到了
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 和the project it links to。
但是,我已经获得了 ASM 的修改版本来使用,因此,使用该项目并不是一个真正的选择。
这将需要我手动分解有问题的方法。值得庆幸的是,这仅发生在一个库类中(到目前为止 -.-),因此它应该是可管理的。
不过,我想检测并报告太大的方法。所以我可以更容易地确定我必须拆分哪些。 (坦率地说,我不明白为什么默认情况下此错误未提供此信息。)
我写了一个MethodVisitor,它将所有超级调用包装在try-catch块中,并且在异常捕获时报告正在处理的方法,但是因为它是ClassWriter的@987654326抛出错误的@方法,用于遍历字节码的MethodVisitor被创建为其中的局部变量,我还没有弄清楚如何插入它。无法覆盖 toByteArray 方法,因为它似乎访问了类私有字段并且简单地复制失败,因为我也几乎需要复制包的其余部分。
我还没有尝试过检测ClassWriter 本身,但在去之前,我想知道是否有更合理的方法来确定哪种方法太大。
【问题讨论】:
-
最简单的方法是向 ASM 开发人员发送功能请求;将异常抛出代码更改为包含方法的名称和类型需要十秒钟......
标签: java debugging instrumentation java-bytecode-asm bytecode-manipulation