2017-01-19 6 views
1

私は、上記のインタフェースを実装する動的プロキシを使用して作成したインタフェースクラス参照とオブジェクトを持っています。 final Class<?> interfaceType; final Object interfaceImplementation = Proxy.newProxyInstance(...)` Guiceとのインタフェースを実装するプロキシにバインド

インターフェイスをプロキシオブジェクトにバインドすることで、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を使用するため、動作しません。クラスはクラスパラメータに渡すことはできません。あなたのサンプルコードは、私がソリューションに近づいてくれました。ありがとう! – hvth

+0

作業コードを別の答えに入れるのが適切なのでしょうか、それともStack Overflowのエチケットを破るのでしょうか? – hvth

関連する問題