我们怎么知道哪个方法(java.class)调用了当前的方法

时间:2012-10-11 07:57:34

标签: java stack-trace

示例:如果我有两个类: A B 。这两个类都可以调用 C 中的方法(例如:init()方法)

C ,我们如何知道来自哪里(来自 A B 类?)

4 个答案:

答案 0 :(得分:3)

要做得对,你应该为C的方法提供这些信息,例如通过枚举或类参数:

public void init(Object otherArg, Class<?> caller) {
    ...
}

public void init(Object otherArg, CallerEnum caller) {
    ...
}

但是如果你不在乎,还有另一种使用堆栈跟踪的方法。查看Get current stack trace in Java并使用堆栈顶部的第二个StackTraceElement来获取调用当前的方法。

答案 1 :(得分:2)

这可能很有用:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
  • 您可以使用它来获取StackTraceElement数组中当前线程的堆栈跟踪,其中数组的第一个元素是堆栈上最新的方法调用序列

  • 如果返回的数组长度非零。 StackTraceElement包含getClassNamegetMethodName等方法,可用于查找调用者类名称或方法名称。

答案 2 :(得分:1)

取自网络的某个地方......

private static final int CLIENT_CODE_STACK_INDEX;

static {
    // Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6
    int i = 0;
    for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
        i++;
        if (ste.getClassName().equals(MyClass.class.getName())) {
            break;
        }
    }
    CLIENT_CODE_STACK_INDEX = i;
}

public static String getCurrentMethodName() {
    return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName();
}
public static String getCallerMethodName() {
    return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX+1].getMethodName();
}

答案 3 :(得分:0)

我找到了一个更简单的解决方案(对我来说:D)

public <T> void init(Class<T> clazz) {
     if (!clazz.getSimpleName().equals("MyClassName")) {
          // do something
     }else{
          // do something
     }
}