2013-01-11 8 views
6

私は、InvocationHandler実装によって裏打ちされたインターフェイスタイプのプロキシインスタンスを作成するために働く、次のコードを持って、私は具象クラス型を使用する場合しかし、それは動作しません、これはよく知られており、Proxy.newProxyInstanceに記載されて:クラスタイプのJavaプロキシインスタンスを作成していますか?

// NOTE: does not work because SomeConcreteClass is not an interface type 
    final ClassLoader myClassLoader = SomeConcreteClass.getClassLoader(); 
    SomeConcreteClass myProxy = (SomeConcreteClass) Proxy.newProxyInstance(myClassLoader, new Class[] { 
     SomeConcreteClass.class }, new InvocationHandler() { /* TODO */ });   

しかし、私が正しく思い出すと、具体的なクラスタイプを模擬することが可能ないくつかのモックフレームワークでは、このユースケースの動作を見てきました。 EasyMock。ソースコードをチェックする前に、インターフェイスだけでなく、具体的なクラスタイプもプロキシにする必要があることを示すことができますか?

答えて

12

JDKの動的プロキシは、インターフェイスでのみ動作します。具体的なスーパークラスを持つプロキシを作成する場合は、代わりにCGLIBのようなものを使用する必要があります。

Enhancer e = new Enhancer(); 
e.setClassLoader(myClassLoader); 
e.setSuperclass(SomeConcreteClass.class); 
e.setCallback(new MethodInterceptor() { 
    public Object intercept(Object obj, Method method, Object[] args, 
     MethodProxy proxy) throws Throwable { 
    return proxy.invokeSuper(obj, args); 
    } 
}); 
// create proxy using SomeConcreteClass() no-arg constructor 
SomeConcreteClass myProxy = (SomeConcreteClass)e.create(); 
// create proxy using SomeConcreteClass(String) constructor 
SomeConcreteClass myProxy2 = (SomeConcreteClass)e.create(
    new Class<?>[] {String.class}, 
    new Object[] { "hello" }); 
+0

その後、OPの質問は次のようになります。CGLIBは、それが動的にASMバイトコード操作ライブラリを使用してプロキシサブクラス用のバイトコードを生成するPure Java :) –

+3

@GiovanniAzuaの面でそれをしませんか。 –

+0

ありがとうございます。 –

関連する問題