Guice SPI: Finden Sie Bindungen durch Wildcard-Typen
-
11-09-2019 - |
Frage
Guice bietet eine Möglichkeit, alle Bindungen für einen bestimmten Typ zu finden ( Injector # findBindingsByType ) und es stellt auch ein TypeLiteral Klasse , aus denen es möglich, eine Wildcard-Typ zu konstruieren scheint. Was ich möchte, ist zu tun, alle Bindungen für eine Art zu finden, die von einem Wildcard-Typ parametriert ist, aber ich kann nicht herausfinden, wie es zu tun. Ein Blick auf dem guice src schlägt, ich könnte den Holzweg, aber ich dachte, ich würde auf jeden Fall fragen, um ... so zum Beispiel eine Art gegeben
Foo<E extends Bar>
BarImplOne implements Bar
BarImplTwo implements Bar
und einige Bindungen wie
bind(new TypeLiteral<Foo<BarImplOne>>() {}).to(MyFooOne.class);
bind(new TypeLiteral<Foo<BarImplTwo>>() {}).to(MyFooTwo.class);
dann will ich mit etwas beiden Bindungen entdecken können, wie
Injector.findBindingsByType(TypeLiteral.get(Types.newParameterizedType(Foo.class, Types.subtypeOf(Bar.class))));
Irgendwelche Ideen?
Prost Matt
Lösung
Leider gibt es keinen out-of-the-box-API, die Ihnen sagen, ob man TypeLiteral von einem anderen zugeordnet werden kann. Sie benötigen eine Old-School-Schleife mit einem Bündel von abscheulichen Instanceof Kontrollen zu tun. Etwas grob wie folgt aus:
for (Map.Entry<Key<?>, Binding<?>> entry
: injector.getBindings().entrySet()) {
Type type = entry.getKey().getTypeLiteral().getType();
if (!(type instanceof ParameterizedType)) continue;
ParameterizedType parameterized = (ParameterizedType) type;
if (parameterizedType.getRawType() != Foo.class) continue;
Type parameter = .getActualTypeArguments()[0]
if (!(parameter instanceof Class)) continue;
Class<?> parameterClass = (Class<?>) parameter;
if (!Bar.class.isAssignableFrom(parameterClass)) continue;
results.add(entry);
}
Natürlich wäre es viel schöner sein, etwas mit einem off-the-shelf-API zu tun. Ich würde einen Beitrag zur Guice begrüßen, dass Geräte und Tests TypeLiteral.isAssignableFrom (TypeLiteral). Kontaktieren Sie unsere Benutzer-Liste freiwillig!