我试图用基于 CDI 的方法替换使用反射通过字符串名称返回类的工厂类。
所以我把一个@Inject @Any Instance<IData> possibleCandidates
作为类变量。然后在getIDataInstanceByClassname(String className)
我通过创建一个实例Class.forName
并将其与possibleCandidates
列表中的每个实例进行比较,然后返回一个匹配的“可注入”实例。
但是访问possibleCandidates
最终以NullPointerException
. 无论我是开始for
循环还是使用possibleCandidates.iterator()
. 但是,检查变量不会返回 null 而是InstanceImpl<T>
填充了各种值。
为什么访问它会产生 NPE?
一些代码:
@Instance
@Any
private Instance<IData> possibleCandidates;
public IData getClassByClassname( String className ) {
try {
Class<?> clazz = Class.forName( className );
Iterator<IData> it = possibleCandidates.iterator(); // NPE gets thrown here
while ( it.hasNext() ) {
IData dataInstance = it.next();
if ( dataInstance.getClass().equals( clazz ) ) {
return dataInstance;
}
}
}
catch( Exception e ) { ... }
}