我具有Java函数的以下结构:

public void recursiveFun(Object currentReturnValue, int numRecursiveCalls) {

for(Method currentMethod: currentReturnValue.getClass().getMethods()) {
    String methodName = currentMethod.getName();
    // base case
    if(methodName.equals("getObject")) {
        Object retVal = currentMethod.invoke(currentReturnValue, null);
        System.out.println(retVal);
        return;
    }
    else {
        numRecursiveCalls++;
        currentReturnValue = currentMethod.invoke(currentReturnValue, null);
        recursiveFun(currentReturnValue, numRecursiveCalls);
        boolean previousFrame = true;
    }
 }


我设置了两个断点,一个在基本情况下,第二个在previousFrame = true。它首先在我的基本情况下停止,然后我继续前进。我发现它确实可以返回到上一帧,因为它将previousFrame设置为true,但是currentReturnValue的类型保持不变!它应该是不同的类型。

例如,Location类具有一个getIdNum(),它返回类型为MyInteger的对象。 MyInteger具有一个getObject()方法,该方法返回一个对象。在我的情况下,return语句应该以currentReturnValue为MyInteger弹出框架,并返回到currentReturnValue是Location的框架。

最佳答案

关键是您不能以这种方式更改currentReturnValue。即使currentReturnValue是对对象的引用,该引用也会按值传递。这意味着您无法更改currentReturnValue指向的对象,以使更改在“父调用”中可见。

如果您能够逐个引用地传递引用,那将起作用(例如,像C#中的out参数)。然后,您可以更改currentReturnValue引用的对象,并且在父调用中它也会更改。

通常,您会让方法返回新的返回值,而不是尝试通过参数输出它。

关于java - 递归与反射行为奇怪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19240781/

10-09 05:03