参数化接口的所有 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)
给定类型:
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)