[英]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.