【发布时间】:2026-02-15 15:30:02
【问题描述】:
我有一个类需要像这样动态初始化:
void doSth(classsuffix) throws Exception {
String classname = "org.test.classname" + classsuffix; // classsuffix is dynamic
Class<?> clazz;
clazz = Class.forName(classname);
TestInterface test = (TestInterface) clazz.newInstance();
test.doStuff();
}
与示例类配对(遵循相同模式的众多类之一):
public class classnameOne implements TestInterface {
@Inject
private Logger log;
// ...
@Override
public void doStuff() {
// Do stuff
log.info("done");
}
}
问题是classnameOne 类中的log 在初始化时将是null,因此log.info() 调用将抛出NullPointerException。
我需要那个记录器,所以在使用newInstance() 创建类时是否有可能初始化注入的属性?
或者有没有其他可能基于字符串动态创建对象?
【问题讨论】:
-
这是the same question as here。简短版本:尽可能切换到构造函数注入。否则,您必须想办法将新实例传递给 CDI,而我不知道该怎么做。
-
@chrylis 我不允许使用弹簧。
-
那么是哪个机制注入了
Logger实例? -
@f1sh 这就是我的问题。我不知道。我所知道的是我不允许使用 spring 并且必须初始化一个动态类名的对象。
-
您正在使用 CDI,它实现了与 Spring 完全相同的功能。 (Spring容器甚至可以为你展示的类提供功能。)问题和解决方法是一样的。
标签: java jakarta-ee reflection