如何检测Java方法中的递归

时间:2014-01-31 21:19:14

标签: java recursion

如何从方法体内部检查,如果我调用的方法,则依次调用我的方法。

// 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()。我想在运行时强制执行此操作。 任何人都可以帮助一个简单的方法吗?

问候。

4 个答案:

答案 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
}