リフレクションを使用してクラスを文字列名で返すFactoryクラスを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 ) { ... }
}