如何从方法体内部检查,如果我调用的方法,则依次调用我的方法。
// the method, that I control
public void myMethod() {
if( stackContainsMyMethod() ) {
throw new RuntimeException("do not call me");
}
...
handler();
}
// someone else implements this
protected abstract void handler();
处理程序不得调用 myMethod()。我想在运行时强制执行此操作。 任何人都可以帮助一个简单的方法吗?
问候。
答案 0 :(得分:6)
如果您尝试仅在第二轮检测到它,则会更容易。这样的事情应该有效。
boolean isRunning;
public void myMethod() {
if (isRunning) {
throw new RuntimeException("do not call me");
}
isRunning=true;
handler();
isRunning=false;
}
答案 1 :(得分:2)
我用useSticks的答案就是这样:
public void myMethod() {
final StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for(int i=0; i < trace.length-1; i++) {
if( trace[i].equals(trace[trace.length-1]) ) {
throw new RuntimeException("do not call me again");
}
}
handle();
}
感谢你们所有人
答案 2 :(得分:1)
如果你的程序都是同步的,你可以设置一个标志
bool calling = false;
public void myMethod() {
if( calling ) {
throw new RuntimeException("do not call me");
}
calling = true;
...
calling = false
}
答案 3 :(得分:1)
如果您想查看当前的堆栈跟踪并自行检查:
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
for(int i=0; i < trace.length; i++) {
//look for yourself and exit
}