2009-07-08 56 views
3

Guice提供了查找給定類型的所有綁定(Injector#findBindingsByType)的方法,它還提供了一個TypeLiteral class,從中可以構建通配符類型。我想要做的是找到所有通過通配符類型參數化的類型的綁定,但我無法弄清楚如何去做。一看吉斯SRC暗示我可能會找錯了樹,但我想我會問問周圍反正...所以例如給出一種類型,Guice SPI:通過通配符類型查找綁定

Foo<E extends Bar> 
BarImplOne implements Bar 
BarImplTwo implements Bar 

和一些綁定像

bind(new TypeLiteral<Foo<BarImplOne>>() {}).to(MyFooOne.class); 
bind(new TypeLiteral<Foo<BarImplTwo>>() {}).to(MyFooTwo.class); 

那麼我希望能夠與像

Injector.findBindingsByType(TypeLiteral.get(Types.newParameterizedType(Foo.class, Types.subtypeOf(Bar.class)))); 

任何想法都發現綁定?

乾杯 馬特

回答

3

不幸的是,有外的開箱沒有API,它會告訴你一個TypeLiteral是否是從另一個分配。你需要用一堆可怕的instanceof檢查來做一個老派的循環。總之像這樣:

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); 
} 

當然,使用現成的API來做某些事情會更好。我希望貢獻Guice來實現和測試TypeLiteral.isAssignableFrom(TypeLiteral)。聯繫我們的用戶名單志願者!

+0

感謝您的指針,我有一個非常簡單的版本(基於上述)工作,適合我的直接需求,但我會嘗試做一個更一般的情況下,處理一些更多的情況,並將其張貼到列表。 – Matt 2009-07-10 23:31:24