我们如何知道哪个方法(java.class)调用了当前方法

我们如何知道哪个方法(java.class)调用了当前方法,java,stack-trace,Java,Stack Trace,示例:如果我有两个类:A和B。这两个类都可以调用C中的方法(例如init()方法) 从C,我们如何知道呼叫来自哪里(从A类或从B类)?从网络的某个地方获取 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

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


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

从网络的某个地方获取

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();
}

要正确执行此操作,应向C的方法提供该信息,例如通过枚举或类参数:

public void init(Object otherArg, Class<?> caller) {
    ...
}
但是如果你不在乎,还有另一种方法可以使用堆栈跟踪。查看并使用堆栈顶部的第二个方法来获取调用当前方法的方法。

这可能很有用:

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

  • 前提是返回的数组长度非零。
    StackTraceElement
    具有类似于
    getClassName
    getMethodName
    等方法,可以使用这些方法查找调用方类名或方法名


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

      public void init(类clazz){
      如果(!clazz.getSimpleName().equals(“MyClassName”)){
      //做点什么
      }否则{
      //做点什么
      }
      }
      
      您可以查看堆栈跟踪,但这不是一个好主意(而且速度相对较慢),您应该将所有重要信息传递给C。顺便说一句,您可以将类作为参数传递,例如
      init(a.class)从技术上讲,这可能很有趣,但一般来说,代码不应该依赖于调用方,它应该依赖于它的参数。你能给我一个例子吗?谢谢,我怀疑不同的深度取决于getStackTrace中的调用级别数,在拍摄快照之前调用getStackTrace。供应商之间也可能有所不同。在类X.foo上执行-将返回“foo”,静态块是为了防止您提到的问题。我试图解释为什么需要静态块,因为您的注释很有趣,但它在JDK 1.5和1.6中有所不同
      
      StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
      
      public <T> void init(Class<T> clazz) {
           if (!clazz.getSimpleName().equals("MyClassName")) {
                // do something
           }else{
                // do something
           }
      }