4

Sunが プロキシ使用ページに投稿したコードを使用しようとしました。また、DebugProxyを使用して、呼び出されたメソッドを出力しようとしました。重要なのは、プロキシを作成しているオブジェクトには引数が必要です。コンストラクターへの引数を使用してプロキシを作成しようとすると、次のエラーが発生します。

スレッド「main」の例外java.lang.ClassCastException:$Proxy0をmyPackage.myClassにキャストできません

私はこのようなプロキシを作成しました:


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

プロキシインスタンスを作成し、それでも適切なコンストラクターを呼び出すにはどうすればよいですか?

4

3 に答える 3

6

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

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

于 2009-06-16T12:46:23.903 に答える
3

あなたのクラスは、テストしようとしているインターフェイスを実装していますか? プロキシ クラスは、インターフェイスからのメソッドのみを実装します。クラスの各メソッドの前後に出力したい場合 (メトリックまたはデバッグ用)、アスペクト指向プログラミング (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));
于 2009-06-16T12:46:50.330 に答える
3

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

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

于 2009-06-16T12:51:42.567 に答える