提问人:SummertimeSadness 提问时间:10/25/2023 更新时间:10/25/2023 访问量:27
当私有字段与子类中的名称相同时,它们不会在父类中自动连接
Private fields are not Autowired in parent class when they have the same name as in child
问:
假设我有一些无法修改的库。它的类如下所示:
public class ClassFromLib {
private Service service;
public void mainActivity () {
//some code
service.doSomething();
//some code
secondaryActivity();
}
public void secondaryActivity() {
//some code
service.doSomething();
//some code
}
@Required
public void setService(Service service) {
this.service = service;
}
}
这个类被配置为 bean:
<bean id="classFromLibBean" class="ClassFromLib">
<property name="service" ref="serviceImpl"/>
</bean>
我需要在我的项目中重写这个类的方法。而且我还需要使用父类中的私有内容。所以,我创建了类似的东西:secondaryActivity
service
public class MyClass extends ClassFromLib {
private Service service;
@Override
public void secondaryActivity() {
//some custom logic
service.doSomething();
//some custom logic
}
@Required
public void setService(Service service) {
this.service = service;
}
}
并添加了 bean 配置:
<bean id="myClassBean" class="MyClass">
<property name="service" ref="serviceImpl"/>
</bean>
但是当我从应用程序上下文中获取自定义 Bean 并调用它时,会返回,因为 field 尚未在父类中初始化,并且它实际上是 null。如果我理解正确,我有这个问题,因为在 bean 初始化期间,它调用子 setter 但忽略了父 setter。我在子类中发现了 WA: rename field 和 setter,但这看起来很丑陋。有没有更好的解决方案?mainActivity
NullPointerException
service
答:
0赞
SummertimeSadness
10/25/2023
#1
回答 ЕмилиянЙорданов 帮助了我:
重写该方法,因为它具有相同的名称和相同的 参数,因此应跳过父类 setter 执行。您可以在子类覆盖中调用 super 方法。@Required public void setService(Service service) { super.setService(服务);this.service = 服务;}
评论