【问题标题】:identifying ``method code too large`` origin识别“方法代码太大”来源
【发布时间】: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 ASMthe project it links to

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

这将需要我手动分解有问题的方法。值得庆幸的是,这仅发生在一个库类中(到目前为止 -.-),因此它应该是可管理的。

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

写了一个MethodVisitor,它将所有超级调用包装在try-catch块中,并且在异常捕获时报告正在处理的方法,但是因为它是ClassWriter的@987654326抛出错误的@方法,用于遍历字节码的MethodVisitor被创建为其中的局部变量,我还没有弄清楚如何插入它。无法覆盖 toByteArray 方法,因为它似乎访问了类私有字段并且简单地复制失败,因为我也几乎需要复制包的其余部分。

我还没有尝试过检测ClassWriter 本身,但在去之前,我想知道是否有更合理的方法来确定哪种方法太大。

【问题讨论】:

  • 最简单的方法是向 ASM 开发人员发送功能请求;将异常抛出代码更改为包含方法的名称和类型需要十秒钟......

标签: java debugging instrumentation java-bytecode-asm bytecode-manipulation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多