gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:45:46 27 4
gpt4 key购买 nike

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

我找到了这样的手动方式:How many bytes of bytecode has a particular method in Java?,但是我的目标是自动扫描许多文件。

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

最佳答案

然而,庞大的方法可能确实永远不会被内联,但我对 8000 的阈值表示怀疑。This comment建议一个小得多的限制,尽管它无论如何都依赖于平台和配置。

您说得对,获取字节码长度需要在那个低级别上处理类,但是,您没有具体说明在尝试使用 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");
}
}

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

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");
}
}

关于java - 如何检查java方法的字节码长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48338337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com