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