サービス インターフェイスに@Service
アノテーション (Spring ではなくカスタム アノテーション) が付けられているプロジェクトがあり、サービスごとに複数の実装 (hibernate、mongodb など) が存在する可能性があります。
次のようなリフレクションを使用して実装クラスをロードしようとしています。
@Service
ステップ 1:アノテーション付きのすべてのインターフェースをロードする
ステップ 2: 各インターフェースのすべてのサブクラスをロードする
コードは次のとおりです。
public static void main(String[] args) throws Exception{
Reflections reflections = new Reflections("net.jitix.cfs");
//load annotated interfaces
Set<Class<?>> types=reflections.getTypesAnnotatedWith(Service.class);
Iterator<Class<?>> typeIterator=types.iterator();
typeIterator.forEachRemaining(new Consumer<Class<?>>() {
@Override
public void accept(Class<?> type) {
if(!type.isInterface()){
typeIterator.remove();
}
}
});
for(Class<?> type:types){
//load implementation classes
Set<Class<?>> implTypes=reflections.getSubTypesOf(type); //error here
}
//rest of the code
}
私が得ているコンパイルエラー:Type mismatch: cannot convert from Set<Class<? extends capture#8-of ?>> to Set<Class<?>>
私の理解 Class<?>
によると、型は何でもかまいません。そのため、必要なメソッドがパラメーターとしてとれない理由がわかりClass<T>
ません。Class<?>
なぜこれが起こっているのかを理解してくれる人はいますか?私のアプローチに代わるものはありますか?前もって感謝します!
編集:@MGorgonによるコメントと@StriplingWarriorおよび@Sotirios Delimanolisによる回答によると、反射法を使用することは問題外です。型の参照を持つ型のサブ型を取得する方法はありますかClass<?>