2015-04-23 41 views
0

我想知道是否有方法可以獲取對.class文件中某個特定方法的調用次數。分析.class文件

我搜索了一下,發現了像ASM和sonarqube這樣的工具,但是我沒有找到獲取我需要的信息的方法。

謝謝

+1

你約達靈靜態或動態的信息?你想知道'.class'本身提及的方法的頻率,或者你想知道一個方法在執行時被調用了多少次? –

+1

您可以使用ASM訪問代碼並計算提及該方法的次數。如果您想在運行時瞭解這些信息,我建議使用面向方面的庫來執行此操作。你可以像ASM一樣(像這些庫一樣),但更高級的庫會更容易。 –

+0

我正在嘗試做靜態分析。試圖計算方法被提及的類的次數 – Nestor

回答

0

字節代碼注入

- >>>注射,你想監控的類中的計數的代碼。

對於字節碼注入,您可以使用ASM或JavaAssit。

http://java.dzone.com/articles/implementing-build-time

+0

非常感謝,但我認爲我不會爲我工作。 使用您的解決方案,我將看到在應用程序運行時調用該方法的次數,但我想進行靜態分析。通過編譯我的項目,我想了解一個方法被調用到類中的次數 – Nestor

0

You Problem Definition Right

解決方案: 嘗試下面的代碼,你會得到一個提示通過字節碼遍歷。如果仔細觀察,您可以看到在代碼中使用了多少次您的方法。爲此你甚至可以使用Regex。

package com.cosmic.evaluate.asm; 
import java.io.FileInputStream; 
import java.io.PrintWriter; 
import org.objectweb.asm.ClassReader; 
import org.objectweb.asm.util.ASMifier; 
import org.objectweb.asm.util.TraceClassVisitor; 

public class TetsMain { 

public static void main(String[] args) throws Exception { 

String classPath =  "./target/classes/com/cosmic/evaluate/asm/TestClass.class"; 

    int flags = ClassReader.SKIP_DEBUG; 


    ClassReader cr; 

    if (classPath.endsWith(".class") || classPath.indexOf('\\') > -1 || classPath.indexOf('/') > -1) { 
     cr = new ClassReader(new FileInputStream(classPath)); 
    } else { 
     cr = new ClassReader(classPath); 
    } 

    cr.accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(System.out)), flags); 

} 

} 

Maven的依賴二手 org.ow2.asm ASM-所有 5.0.3

鏈接 Tutorial for Regular Expression