gpt4 book ai didi

java - 递归与反射的行为异常

转载 作者:行者123 更新时间:2023-12-01 14:02:32 26 4
gpt4 key购买 nike

我有以下 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;
}
}

我设置了 2 个断点,一个在基本情况下,第二个在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com