引数を取るコンストラクターで動的プロキシを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1001191

  •  05-07-2019
  •  | 
  •  

質問

プロキシ使用ページ、DebugProxyを使用して、どのメソッドが呼び出されるかを出力しようとしました。問題は、プロキシを作成しているオブジェクトには引数が必要だということです。コンストラクターへの引数を使用してプロキシを作成しようとすると、次のエラーが表示されます。

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass

このようにプロキシを作成しました:


MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props));

どのようにしてプロキシインスタンスを作成し、それでも正しいコンストラクタを呼び出すことができますか?

役に立ちましたか?

解決

JDKで生成されたプロキシは、プロキシしているオブジェクトと同じクラスタイプではありません。代わりに、ターゲットオブジェクトの同じインターフェイスを実装します。これらのインターフェイスタイプのいずれかにキャストする必要があります。

リンク先のページの例を見ると、FooImplではなくFooにキャストされています。

他のヒント

クラスは、テストしようとしているインターフェイスを実装していますか?プロキシクラスは、インターフェイスからのメソッドのみを実装します。クラスの各メソッドの前/後に印刷する場合(メトリックまたはデバッグ用)、アスペクト指向プログラミング(AOP)の使用をお勧めします。自分でやったことはありませんが、 AspectJ が欲しいと聞きました。

public interface SomeInterface {
    public void someMethod();
}

public MyClass implements SomeInterface {
...
}

// DebugProxy doesn't return your class, but a class which implements all of the interfaces
// you class implements
SomeInterface mc = (SomeInterface ) DebugProxy.newInstance(new MyClass(props));

プロキシを作成する場合、実装するインターフェイスを提供する必要があります。具象クラスではありません。

インターフェースはコンストラクターを記述しないため、実行したいことはすぐには実行できません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top