[code="java"]
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
public abstract class Caller {
private static Map> callMap = new HashMap>();
public Map<String, List<CallObj>> getCallList() {
return callMap;
}
//被调用类名
private String className;
//被调用方法名
private String methodName;
public void setClassName(String className) {
this.className = className;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
/**
* 注册调用信息
*/
public synchronized void registerCall() {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
// 然后从栈中向上搜索,直到搜索到我们的类。
int i = 0;
while (i < stack.length) {
StackTraceElement frame = stack[i];
String cname = frame.getClassName();
if (cname.equals(className)) {
break;
}
i++;
}
while (i < stack.length) {
StackTraceElement frame = stack[i];
String cname = frame.getClassName();
//确认被调用类信息Map是否存在
if (!cname.equals(className)) {
if (callMap.get(className) == null) {
//初始化类被调用类信息Map
callMap.put(className, new ArrayList<CallObj>());
}
//调用类List
List<CallObj> callList = callMap.get(className);
CallObj obj = new CallObj();
obj.setClassName(cname);
obj.setMethodName(frame.getMethodName());
obj.setLine(frame.getLineNumber());
obj.setCallMethodName(methodName);
//确认信息
checkCallList(callList, obj);
break;
}
i++;
}
}
/**
* 确认注册信息
* @param callList
* @param obj
*/
public void checkCallList(List<CallObj> callList, CallObj obj) {
for (CallObj callObj : callList) {
//确认调用对象是否存在
if (callObj.getClassName().equals(obj.getClassName())
&& callObj.getMethodName().equals(obj.getMethodName())
&& callObj.getCallMethodName().equals(methodName)) {
//当满足上面条件是调用次数+1
callObj.setCallCount(callObj.getCallCount() + 1);
printCallInfo(callList, obj);
return;
}
}
//如果不存在
obj.setCallCount(1);
//添加到调用List
callList.add(obj);
printCallInfo(callList, obj);
}
/**
* 输出调用信息
* @param callList
* @param callObj
*/
public void printCallInfo(List<CallObj> callList, CallObj callObj) {
System.out.println(className + "--"+ methodName +" CallInfo:");
for (CallObj obj : callList) {
if (obj.getClassName().equals(callObj.getClassName())
&& obj.getMethodName().equals(callObj.getMethodName())) {
System.out.println("Class: " + obj.getClassName()+"."+obj.getMethodName()+"("+obj.getLine()+")");
System.out.println("CallCount: " + obj.getCallCount());
System.out.println();
return;
}
}
}
}[/code]
[code="java"]
public class CallObj {
//调用类名
private String className;
//调用方法名
private String methodName;
//调用方法行数
private int line;
//被调用方法名
private String callMethodName;
//调用次数
private int callCount;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public int getCallCount() {
return callCount;
}
public void setCallCount(int callCount) {
this.callCount = callCount;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public int getLine() {
return line;
}
public void setLine(int line) {
this.line = line;
}
public String getCallMethodName() {
return callMethodName;
}
public void setCallMethodName(String callMethodName) {
this.callMethodName = callMethodName;
}
}[/code]
[code="java"]public class A extends Caller {
public A(){
super.setClassName(A.class.getName());
super.setMethodName("c");
this.registerCall();
}
public void c(){
System.out.println("method c is call");
}
}[/code]
[code="java"]public class B {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
a.c();
}
}[/code]
自己做的一个工具类,里面还有调用次数