簡體   English   中英

Java如何查找方法被調用的次數

[英]Java how to find number of times a method is called

我需要找出一個類上的每個方法被調用多少次。 JDK源代碼需要分析的源代碼。
我使用了Eclipse JDT。 該程序的工作方式是傳遞JDK Source目錄。 它加載源並從中創建一個compiledunit。 然后,我打印出所有完全限定的方法名稱。 即package.class.method名稱。

現在,我需要找出在其他源文件中調用package.class.method的時間。 如果可以的話,請提供源代碼。

這是我到目前為止編寫的代碼:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package methodcallcounter;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.TypeDeclaration;

public class MethodCallCounter {


    //use ASTParse to parse string
    public static CompilationUnit parse(String str, String fileName) {
        ASTParser parser = ASTParser.newParser(AST.JLS3);
        parser.setSource(str.toCharArray());
        parser.setResolveBindings(true);
        parser.setStatementsRecovery(true);
        parser.setBindingsRecovery(true);
        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setUnitName(fileName);

        final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

        return cu;
    }

    //read file content into a string
    public static String readFileToString(String filePath) throws IOException {
        StringBuilder fileData = new StringBuilder(1000);
        BufferedReader reader = new BufferedReader(new FileReader(filePath));

        char[] buf = new char[10];
        int numRead = 0;
        while ((numRead = reader.read(buf)) != -1) {
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }

        reader.close();

        return fileData.toString();
    } 

    public static void listf(String directoryName, ArrayList<File> files) {
        File directory = new File(directoryName);

        // get all the files from a directory
        File[] fList = directory.listFiles();

        for (File file : fList) {
            if (file.isFile()) {
                files.add(file);

            } else if (file.isDirectory()) {
                listf(file.getAbsolutePath(), files);
            }

        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, JavaModelException {

        ArrayList<File> al = new ArrayList<File>();
        ArrayList<CompilationUnit> cul = new ArrayList<CompilationUnit>();

        String dirPath = "C:\\Java\\SRC\\";
        listf(dirPath, al);

        for (File f : al) {
            cul.add(parse(readFileToString(f.getAbsolutePath()), f.getAbsolutePath()));
        }

        for (CompilationUnit c : cul) {
            try { 
                List<TypeDeclaration> types = c.types();

                for (TypeDeclaration object : types) {
                    if (object.getNodeType() == ASTNode.TYPE_DECLARATION){
                        String s = c.getPackage().getName().getFullyQualifiedName() + "." +
                            object.getName().getFullyQualifiedName();

                        MethodDeclaration[] meth = object.getMethods();
                        for (MethodDeclaration m : meth) {
                            //
                            System.out.println(s + " " +m.getName().getFullyQualifiedName());
                        }
                    } 
                } 

            } catch (NullPointerException ex) {
                System.out.println("Error : " + c.toString());
            }
        }
    }

}

如果您確切知道要搜索的文本,則可以重定向控制台輸出,可以使用grep和wc命令在linux上實現該輸出,如下所示執行它:

java mainclass | grep "searchpatterntomethodname" | wc -l

在Windows系統上,您有一個名為findstr的工具,該工具與grep等效,而find與wc等效。 這樣,您就可以將執行輸出過濾到搜索模式並計算行數,該行數必須與方法調用相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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