如何检查 java 方法的字节码长度
How to check bytecode length of java method
此时此刻,我参与了大型遗留项目,其中包含许多巨大的 classes 和生成的代码。
我希望找到所有字节码长度大于 8000 字节的方法(因为 OOTB java 不会对其进行优化)。
我找到了这样的手动方式:How many bytes of bytecode has a particular method in Java?
,但是我的目标是自动扫描许多文件。
我尝试使用 jboss-javassist,但 AFAIK 获取字节码长度仅在 class 级别可用。
巨大的方法可能确实永远不会被内联,但是,但我对 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 编写和测试的。如果您有 different/older 版本,则必须使用
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");
}
}
此时此刻,我参与了大型遗留项目,其中包含许多巨大的 classes 和生成的代码。 我希望找到所有字节码长度大于 8000 字节的方法(因为 OOTB java 不会对其进行优化)。
我找到了这样的手动方式:How many bytes of bytecode has a particular method in Java? ,但是我的目标是自动扫描许多文件。
我尝试使用 jboss-javassist,但 AFAIK 获取字节码长度仅在 class 级别可用。
巨大的方法可能确实永远不会被内联,但是,但我对 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 编写和测试的。如果您有 different/older 版本,则必须使用
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");
}
}