6

実行時に生成されるオブジェクトに機能を追加したいと考えています。ただし、このオブジェクトのインターフェイスは非常に大きいです (そして、私の制御下にはありません)。必要な機能を追加し、標準インターフェイス機能を元のオブジェクトに委任する独自のクラスでオブジェクトをラップしたいと思います-Javaでこれを行う方法はありますか?インターフェイスのメソッド?

避けたいこと:

class MyFoo implements Foo {
  Foo wrapped;

  void myMethod() { ... }

  void interfaceMethod1() wrapped.interfaceMethod1();
  int interfaceMethod2() wrapped.interfaceMethod2();
  // etc etc ...
}

私が好むもの:

class MyFoo implements Foo {
  Foo wrapped;

  void myMethod() { ... }

  // automatically delegate undefined methods to wrapped object
}
4

1 に答える 1

11

動的プロキシが必要で、オーバーライドしたいメソッドだけをインターセプトする必要があるようです。

動的プロキシ クラスは、実行時に指定されたインターフェイスのリストを実装するクラスです。これにより、クラスのインスタンスのいずれかのインターフェイスを介したメソッド呼び出しがエンコードされ、統一インターフェイスを介して別のオブジェクトにディスパッチされます。したがって、動的プロキシ クラスを使用して、コンパイル時ツールなどを使用してプロキシ クラスを事前に生成しなくても、インターフェイスのリストに対してタイプ セーフなプロキシ オブジェクトを作成できます。動的プロキシ クラスのインスタンスでのメソッド呼び出しは、インスタンスの呼び出しハンドラ内の単一のメソッドにディスパッチされ、呼び出されたメソッドを識別する java.lang.reflect.Method オブジェクトと、そのメソッドを含む Object 型の配列でエンコードされます。引数

(私の強調)

InvocationHandlerを実装することで、そのオブジェクトのすべての呼び出しを受け取る 1 つのメソッドを作成するだけです (事実上、上記で説明したこと)。

于 2012-11-12T17:15:09.443 に答える