参数化接口的所有 bean 的编程查找

Programmatic lookup of all beans of parametrized interface

给定类型:

public interface Foo<T, X extends A>{...}

我需要使用编程查找来查找实现给定接口的 bean,而不考虑参数类型。由于类型安全解析,这个 returns 是一个空集:

final Set<Bean<?>> foos= BeanManagerProvider.getInstance().getBeanManager().getBeans(Foo.class, new AnyLit());

或通过 Deltaspike:

org.apache.deltaspike.core.api.provider.BeanProvider.getDependent(Foo.class, new AnyLit())

AnyLit 所在的位置:

private static class AnyLit extends AnnotationLiteral<Any> implements Any
{

}

有什么办法可以解决这个问题吗?

谢谢

我认为您可以使用 TypeLiteral - 一个特殊的 CDI class,它可以保存类型及其参数。通过这个,您可以大致以这种方式指定您想要的内容:

TypeLiteral<Foo<Object, Object>> typeLiteral = new TypeLiteral<Foo<Object, Object>>() {};
BeanManager bm; //assuming you can retrieve BM somehow
bm.getBeans(typeLiteral.getType(), new AnyLit());

现在,这(我希望)符合 CDI assignability rules警告:前面是泛型,阅读前喝杯咖啡)。简而言之,您想使用 Object 作为类型,以便:

  • 它找到所有其他类型,例如 bar <Bar>(它们都可以分配给 Object
  • 参数,例如FooImpl<T> implements Foo<T>也可以分配给Object
  • 它也找到原始类型的bean,例如MyFoo implements Foo

查看容器提供的 Instance bean 并执行如下操作:

@Any
@Inject
private Instance<MyInterface<?>> myParametrizedInterfaces;

Instance bean 是一个 Iterable,这意味着您可以迭代所有实现上述接口的 bean

注意 ? 泛型参数。在这种情况下,所有通用参数都将匹配 (java generics)