如何获取方法的调用者类

时间:2012-09-24 15:10:44

标签: java

我如何知道哪个类称为方法?

class A {
   B b = new B();

   public void methodA() {
    Class callerClass = b.getCallerCalss(); // it should be 'A' class
   } 
}

class B {
 public Class getCallerCalss() {
   //... ???
   return clazz;
 }
}

4 个答案:

答案 0 :(得分:4)

使用Thread.currentThread().getStackTrace()即可轻松完成。

public static void main(String[] args) {
    doSomething();
}

private static void doSomething() {
    System.out.println(getCallerClass());
}

private static Class<?> getCallerClass() {
    final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    String clazzName = stackTrace[3].getClassName();
    try {
        return Class.forName(clazzName);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}
使用

[3]是因为[0]Thread.currentThread()的元素,[1]getCallerClass的元素,[2]doSomething的元素},最后,[3]main。如果你将doSomething放在另一个类中,你会看到它返回正确的类。

答案 1 :(得分:3)

有一种观察堆栈跟踪的方法

StackTraceElement[] elements = Thread.currentThread().getStackTrace()

Javadoc

  

数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。

答案 2 :(得分:3)

您可以通过获取堆栈跟踪的第二个元素来获取调用者类的类名:

final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[1].getClassName());

getClassName类的StackTraceElement方法返回String,因此您不会遗憾地获得Class个对象。

答案 3 :(得分:0)

尝试Throwable.getStackTrace()

创建一个新的Throwable ..你不必扔它:)。

未经测试的:

Throwable t = new Throwable();
StackTraceElement[] es = t.getStackTrace();
// Not sure if es[0] would contain the caller, or es[1]. My guess is es[1].
System.out.println( es[0].getClass() + " or " + es[1].getClass() + " called me.");

显然,如果您正在创建某个功能(getCaller()),那么您必须在堆栈跟踪中再次升级。