ASM 跳过某些方法的代码

ASM Skip Code for some Methods

有没有办法告诉 ASM 我不想使用特定方法的SKIP_CODE选项?例如,如果我有一个非常大的 class 像这样:

public class Large
{
    public void doManyThings() { /* ... */ }

    public void methodWithLongBytecode() { /* ... */ }

    public @inline void inlinableMethod() { /* ... */ }
}

我的编译器在不需要代码的方法上花费了大量时间,因为它们无论如何都无法内联。但是,我仍然希望能够读取 inlineableMethod 以便编译器可以将其字节码内联到调用方中。有没有办法在 class 使用 ASM 5.0.3 读取期间临时 'disable' SKIP_CODE 标志?

很遗憾,没有。如果查看 source code of a ASM ClassReader,您会发现 SKIP_CODE 属性被解释一次,然后存储在局部变量中。因此,即使通过反射性地更改标志,您也可以跳过所有方法或不跳过任何方法。但是,通过从 visitMethod 返回 null,您可以指示完全不解释方法。