Woj*_*iak 2 java bytecode bytecode-manipulation jvm-bytecode
目前,我参与了一个大型遗留项目,其中包含许多巨大的类和生成的代码。我希望找到所有字节码长度大于 8000 字节的方法(因为 OOTB java 不会优化它)。
我找到了这样的手动方式:How much bytes of bytecode has a certain method in Java? ,但是我的目标是自动扫描许多文件。
我尝试使用 jboss-javassist,但据我所知,获取字节码长度仅在类级别可用。
然而,巨大的方法可能确实永远不会被内联,但我对 8000 的阈值有疑问。这个评论建议一个更小的限制,尽管它无论如何都是依赖于平台和配置的。
\n\n您是对的,获取字节码长度需要在较低级别上处理类,但是,您没有\xe2\x80\x99t 指定在尝试使用 Javassist 执行此操作时遇到的实际障碍。使用 Javassist 执行此操作的简单程序将是
\n\ntry(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {\n ClassFile\xe2\x80\x8b cf = new ClassFile(new DataInputStream(is));\n for(MethodInfo mi: cf.getMethods()) {\n CodeAttribute ca = mi.getCodeAttribute();\n if(ca == null) continue; // abstract or native\n int bLen = ca.getCode().length;\n if(bLen > 300)\n System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是使用最新版本的 Javassist 编写和测试的,该版本在 API 中使用泛型。如果您有不同/旧版本,则必须使用
\n\ntry(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {\n ClassFile\xe2\x80\x8b cf = new ClassFile(new DataInputStream(is));\n for(Object miO: cf.getMethods()) {\n MethodInfo mi = (MethodInfo)miO;\n CodeAttribute ca = mi.getCodeAttribute();\n if(ca == null) continue; // abstract or native\n int bLen = ca.getCode().length;\n if(bLen > 300)\n System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n