gpt4 book ai didi

java - Spring:从返回 null 的 final方法访问字段

转载 作者:行者123 更新时间:2023-12-02 07:49:50 27 4
gpt4 key购买 nike

所以我在我的项目中遇到了一个非常奇怪的错误。我有以下两个类

@Component
@Scope("prototype")
public abstract class World {
String name;

public World(String name) {
this.name = name;
}

final void print() {
System.out.println(name);
}
}

@Component
@Scope("prototype")
public class Hello extends World {

public Hello(String name) {
super(name);
}
}

当我使用context.getBean(Hello.class, "foo")实例化一个对象时,我得到一个Hello类bean。但是当我 hello.print() 时,它打印了 null

删除最终修饰符解决了该问题。这里发生了什么? spring对final方法有什么限制吗?

最佳答案

我的假设是您使用CGLIB代理。您可以通过以下方式检查:

context.getBean(Hello.class, "foo").getClass()

在这种情况下,Spring 要求 CGLIB 创建 Hello 的子类。该子类获取 Hello 类的真实实例。这允许重写所有方法,然后最终调用目标,大致如下:

class Proxy extends Hello {
Hello target;

void print() {
target.print();
}
}

因为您将方法标记为 final Java 不允许重写。并且代理本身(虽然是 Hello 的子类)不会初始化 name 字段 - 它为 null。

因此,您真正的 Hello#print() 方法不会被调用 - 仅调用 Proxy#print() 并且 Proxy#name 被调用null,这会导致控制台中显示 null。

关于java - Spring:从返回 null 的 final方法访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44386068/

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