0

Proxy クラスのメソッド シグネチャは次のとおりです。

Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

Proxy クラスの newProxyInstance のソース コードを確認しましたが、プロキシ オブジェクトが InvocationHandler メソッドに自身を渡す場所が見つかりませんでした

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;

誰か知っていますか?

ありがとう

4

1 に答える 1

8

通常の方法で参照を提供する必要があります。InvocationTargetHandler一般的なパターンの 1 つは、最終変数を作成してターゲットを参照し、次のようにProxy.newProxyInstanceメソッド に匿名の実装を渡すことです。

final Object myObject = /*initialize the proxy target*/;
final Object proxy = Proxy.newProxyInstance(
    classLoader,
    new Class[] { /*your interface(s)*/ }, 
    new InvocationTargetHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) {
            return method.invoke(myObject, args);
        }
});

この例は、何もせずにすべてのメソッド呼び出しにパッチを適用するため、世界で最も無意味なプロキシですが、InvocationTargetHandlerあらゆる種類の楽しいもので埋めることができます。

プロキシ化されたオブジェクトがコントラクトの一部を形成しないため、API が少しぎこちなく感じることがありますが、JDK の作成者は、プロキシ クラスがバッキングの具体的な実装なしで存在できるようにしたいと考えていました。彼らがそのようにしたことは非常に役に立ちます...ユニットテストのモックオブジェクトは素晴らしい例です。

于 2012-12-04T21:25:44.030 に答える