gpt4 book ai didi

java - 无法解释的字段值更改

转载 作者:行者123 更新时间:2023-11-29 03:59:27 25 4
gpt4 key购买 nike

看看这个奇怪的问题:

Debugging steps

  1. 我在所有访问字段 res1
  2. 上设置了一个断点
  3. Res1被赋予f的值,即“bar”
  4. Res1 现在是“bar”
  5. 在下一次中断时,res1 突然null

为什么这是不可能的?

  • 因为 res1 上的断点,我可以看出它根本不应该改变
  • 它不能,因为我没有在赋值和 assertEquals 之间显式更改它,并且此代码在单个 JUnit 线程中运行。
  • 没有其他名为 res1 的字段或变量。

会发生什么?我假设这不是 JVM 中的错误,但谁知道呢。


正如 Jon Skeet 所说,问题在于实例不同。这是由这个奇怪的反射问题引起的:

public class ServiceObject {

private static final Map<Class<?>, Map<String, Operation>> opsByClass =
new ConcurrentHashMap<Class<?>, Map<String,Operation>>();

private final Object target;
private final Map<String, Operation> myClassOps;

private class Operation {
private final Method method;
public Operation(Method met) {
this.method = met;
method.setAccessible(true);
}
public void execute(Map<String,?> args, Responder responder, Object context, boolean coerce) {
...
method.invoke(target, mArgs);
}
}

public ServiceObject(Object target) {
Class<?> myClass = target.getClass();
Map<String, Operation> op = opsByClass.get(myClass);
if (op == null) {
op = new HashMap<String, Operation>();
for (Method meth : myClass.getMethods()) {
...
op.put(opName, new Operation(meth));
}
opsByClass.put(myClass, op);
}
this.target = target;
this.myClassOps = op;
}

public void execute(String opName) {
Operation op = myClassOps.get(opName);
...
op.execute(args, responder, context, coerce);
}
}

// Foo is equivalent to the class that contains <res1> above
class Foo {

@ServiceOperation
public void bar() {
// breakpoint here
}

}

运行测试时会发生什么:

a = new Foo();
b = new Foo();
svc = new ServiceObject(a);
svc.execute("bar", ...); // inside Foo.bar() <this> will be <a>
svc = new ServiceObject(b);
svc.execute("bar", ...); // inside Foo.bar() <this> will still be <a>, but should be <b>

最佳答案

猜测:您在断言阶段看到的是与设置为“bar”时不同的类实例。

虽然没有看到其余代码,但很难判断。

编辑:问题是您的opsByClass 缓存将包含一个操作,它隐式地具有关联的ServiceObject。因此,当您使用 Foo 创建第一个 ServiceObject 时,它将缓存与第一个 ServiceObject 实例关联的 Operation 实例。当您在 ServiceObjectsecond 实例上调用 svc.execute 时,它将在映射中查找操作,并找到 与第一个实例关联的操作...这可能不是您想要的。

关于java - 无法解释的字段值更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4398485/

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