Guice SPI: найти привязки по типам подстановочных знаков - PullRequest
3 голосов
/ 09 июля 2009

Guice предоставляет средство для поиска всех привязок для данного типа ( Injector # findBindingsByType ), а также предоставляет TypeLiteral класс , из которого представляется возможным создать подстановочный тип. Я хотел бы найти все привязки для некоторого типа, который параметризован подстановочным типом, но я не могу понять, как это сделать. Взглянув на суровое суждение, можно предположить, что я, возможно, лаю не на том дереве, но я решил все равно спросить ... так, например, для типа

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

Есть идеи?

Приветствие Matt

1 Ответ

3 голосов
/ 09 июля 2009

К сожалению, нет готового API, который бы сообщал вам, можно ли назначить один TypeLiteral другому. Вам нужно будет выполнить цикл старой школы с кучей отвратительных проверок экземпляров. Что-то грубое, как это:

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). Свяжитесь с нами, чтобы стать волонтером!

...