如何检查java方法的字节码长度



此刻,我参与了大型遗留项目,其中包含许多大型类和生成的代码。我希望找到字节码长度大于 8000 字节的所有方法(因为 OOTB java 不会优化它(。

我找到了这样的手动方法:在 Java 中有多少字节的字节码具有特定方法?,但是我的目标是自动扫描许多文件。

我尝试使用jboss-javassist,但是AFAIK获取字节码长度仅在类级别可用。

然而,巨大的方法可能永远不会被内联,但我对 8000 的阈值表示怀疑。此评论建议的限制要小得多,尽管无论如何它都取决于平台和配置。

您是对的,获取字节码长度需要在低级别上处理类,但是,您没有指定在尝试使用 Javassist 执行此操作时遇到的实际障碍。一个简单的程序用Javassist做到这一点,将是

try(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {
    ClassFile​ cf = new ClassFile(new DataInputStream(is));
    for(MethodInfo mi: cf.getMethods()) {
        CodeAttribute ca = mi.getCodeAttribute();
        if(ca == null) continue; // abstract or native
        int bLen = ca.getCode().length;
        if(bLen > 300)
            System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");
    }
}

这是使用最新版本的Javassist编写和测试的,该版本在API中使用泛型。如果您有不同/较旧的版本,则必须使用

try(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {
    ClassFile​ cf = new ClassFile(new DataInputStream(is));
    for(Object miO: cf.getMethods()) {
        MethodInfo mi = (MethodInfo)miO;
        CodeAttribute ca = mi.getCodeAttribute();
        if(ca == null) continue; // abstract or native
        int bLen = ca.getCode().length;
        if(bLen > 300)
            System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");
    }
}

相关内容

  • 没有找到相关文章

最新更新