java - 有没有办法知道调用者类名?

标签 java

假设我有一个方法 classA.methodA() 及其调用 classB.methodB()。现在,在 classB.methodB() 中,有什么方法可以知道它被 classA 调用(无需传递任何显式信息)。我知道这个信息存在于 Java 运行时中。我的问题是如何获取被调用方法的类名?

让它更明显

ClassA{

methodA(){
  ClassB b = new ClassB();
  b.methodB();

}

}


ClassB{

methodB(){
  // Code to find that its being called by ClassA
}

}

最佳答案

您可以使用 Thread.currentThread().getStackTrace() 获取堆栈跟踪,然后遍历它以查找堆栈中哪个方法在您的方法之上。

例如(这里完全由堆栈组成),你可能有这样一个堆栈:

main()
|- Foo()
   |- Bar()
      |- MyFunction()
         |- getStackTrace()
            |- captureJavaThreadStack(...)

从底部开始迭代,直到您点击 getStackTrace() 方法。然后您知道调用方法是从该位置向上的两个方法,即 MyFunction() 调用了 getStackTrace(),这意味着 MyFunction() 将始终位于 getStackTrace() 之上,并且任何调用的 MyFunction() 都将位于其之上。

您可以在 StackTraceElement 类上使用 getClassName() 方法从选定的堆栈跟踪元素中提取类名。

文档:

http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#getStackTrace%28%29

http://docs.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html

关于java - 有没有办法知道调用者类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340785/

相关文章:

java - selenium 3.3.1 中的 Actions 类已弃用,使用 contextClick 寻找解决方案

java - 从 Java 调用 C++ DLL

java - 处理与 JNI 的关联

java - 运行 Maven2 和 Maven3

java - 使用 java 扫描器类读取最后的空格

java - 如果数据存在或如果数据不存在如何检索单行 - hibernate

java - 在 Eclipse Neon 上运行 Apache UIMA Ruta Workbench 2.5.0 时出错

java - AWS S3复制对象源 key 和目标 key

java - 使用@Reference获取服务导致maven构建警告

java - 通知演示者模型已更改