我如何知道哪个类称为方法?
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;
}
}
答案 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()
数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。
答案 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()
),那么您必须在堆栈跟踪中再次升级。