[英]How to check bytecode length of java method
目前,我参加了一个大型遗留项目,其中包含许多巨大的类和生成的代码。 我希望找到所有字节码长度大于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");
}
}
已使用在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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.