簡體   English   中英

如何檢查Java方法的字節碼長度

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM