我具有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/