2017-01-19 9 views
1

У меня есть ссылка класса интерфейса и объект, который я создал с помощью динамического прокси-сервера, который реализует интерфейс выше. final Class<?> interfaceType; final Object interfaceImplementation = Proxy.newProxyInstance(...)` Связывание интерфейса с Guice с прокси-сервером, который его реализует

Я хочу сделать экземпляр прокси доступным в контексте приложения Guice, привязывая интерфейс к прокси-объекту. Я попытался, но не смог быстро добиться этого с Гисом.

Можно ли сделать что-то вроде: bind(interfaceType).toInstance(interfaceImplementation); , чтобы я мог ввести интерфейс в другие классы?

ответ

2

Проблема заключается в том, что тип возвращаемого Proxy.newProxyInstance() только Object, но bind(...).toInstance(...) хочет убедиться, что тип такой же, как ? от Class<?> interfaceType. В какой-то момент вам понадобится сделать непроверенный бросок, чтобы все работало. Вот как я бы писать:

private <T> T newProxyInstance(ClassLoader loader, InvocationHandler handler, Class<T> primaryInterface, Class<?>... extraInterfaces) { 
    Class<?>[] allInterfaces = Lists.asList(primaryInterface, extraInterfaces) 
      .stream() 
      .toArray(Class<?>[]::new); 
    @SuppressWarning("unchecked") 
    T proxy = (T) Proxy.newProxyInstance(loader, allInterfaces, handler); 
    return proxy; 
} 

то я думаю

bind(interfaceType) 
     .toInstance(newProxyInstance(loader, handler, interfaceType[, ...])); 

будет работать.

+0

Фактически, неконтролируемый отбор не нужен, вы можете просто сделать «primaryInterface.cast (proxy)»; –

+0

В приведенном вами примере представлены несколько интерфейсов, которые не так важны для этого обсуждения, но 'newProxyInstance()' точно соответствует методу, который я создаю для создания прокси. Но чтобы вернуться к вашему предложению, это не сработает, потому что вы используете общий тип T вместо захвата wild card. Класс не может быть передан в параметр класса . Ваш образец кода действительно приблизил меня к решению, спасибо, спасибо! – hvth

+0

Было бы уместно поместить рабочий код в отдельный ответ или это нарушит этикетки переполнения стека? – hvth