示例:如果我有两个班级:A和B。两个类都可以调用C中的方法(例如:init()
方法)
从C,我们如何知道呼叫来自哪里(来自A类或B类)?
要做到这一点,您应该向 C 的方法提供该信息,例如通过枚举或类参数:
public void init(Object otherArg, Class<?> caller) {
...
}
或者
public void init(Object otherArg, CallerEnum caller) {
...
}
但是,如果您不在乎,还有另一种使用堆栈跟踪的方法。查看Get current stack trace in Java并使用堆栈顶部的第二个StackTraceElement来获取调用当前堆栈的方法。
这可能有用:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
您可以使用它来获取数组中当前线程的堆栈跟踪,其中StackTraceElement
数组的第一个元素是堆栈上最近的方法调用序列
如果返回的数组长度不为零。
StackTraceElement
具有 , 等方法getClassName
,getMethodName
可用于查找调用者类名或方法名。
取自网络某处...
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();
}
我找到了一个更简单的解决方案(对我来说:D)
public <T> void init(Class<T> clazz) {
if (!clazz.getSimpleName().equals("MyClassName")) {
// do something
}else{
// do something
}
}