我试图用基于 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 ) { ... }
}