weixin_42324104 2009-07-22 15:44
浏览 229
已采纳

在class a的函数c()中,如何获得调取是哪个class在调用a中的c()函数?

详细如下:
[code="java"]
public class A{
public void c(){
//这里如何获取调用该函数的class名称
System.out.println("class name");
}
}

public class B{
public void test(){
A a = new A();
a.c();//此时输入class B的名称
}
}

public class C{
public void test(){
C c = new C();
c.c();//此时输入class C的名称
}
}
[/code]
[b]问题补充:[/b]
[code="java"]
public class C{

public void test(){

C c = new C();

c.c();//此时输入class C的名称

}

}[/code]

写错了,应该是:
[code="java"]
public class C{

public void test(){

A a = new A();

a.c();//此时输入class C的名称

}

}[/code]

  • 写回答

3条回答 默认 最新

  • fdsafds 2009-07-22 16:04
    关注

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

    自己做的一个工具类,里面还有调用次数

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记