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

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

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

[quote]

public class C{

public void test(){

C c = new C();

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

}

}

[/quote]
是不是应该是

[code="java"]#

public class C{

public void test(){

A a = new A();

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

}

} [/code]

:D

对LZ的问题没有找到好的解决办法.
考虑classloader 和 调用栈 没有得到一个成型的方法.

为什么LZ不在A对象构造的时候直接把调用了传给A呢? 这样是否可以?