2011-10-24 19 views
13

Javaプログラムでメソッドインターセプタを定義したいと思います。つまり、それぞれのメソッド呼び出しで実行される動作が必要です。 このアプリケーションはアプリケーションサーバーでは実行されないため、呼び出すインターセプタの周りでEJBを使用することはできません。私は、標準のJavaライブラリで素敵なProxy APIを見つけましたが、それは、プロキシの作成のインターフェイスを必要とするため、その制限されてい :具体的なクラスの動的プロキシ

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), 
             new Class[] { Foo.class }, 
             handler); 

はとして宣言するFOO.CLASSを強制しない同様のAPIがありますインタフェース?

答えて

7

なぜ使用しないのですかCGLIB?詳細については、this articleを参照してください。

インターフェイスを持たないレガシークラスをプロキシする場合はどうすればよいですか? CGLIBを使用できます。 CGLIBは強力で高性能なコード 世代のライブラリです。表紙の下では、小さくても高速の バイトコード操作フレームワークであるASMを使用して、既存のバイトコードを に変換して新しいクラスを生成します。 CGLIBは、JDKの動的プロキシ アプローチよりも高速です。本質的には、サブクラスを動的に生成して、 プロキシされたクラスの最終的なメソッドをオーバーライドし、 がユーザー定義のインターセプタにコールバックするワイヤをフックします。

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html – eliocs

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/MethodInterceptor.html – eliocs

+0

私は新しいですCGLIBに私の理解は、メモリ内のクラスバイナリを生成しますが、既存のクラスローダはファイルシステムからクラスをロードするだけなので、独自のクラスローダをどのように使用するのですか? – Chao

1

残念ながら、クラスにはこのようなAPIはありません。多くのフレームワークは、これを達成するためにCGLIBのようなバイトコード生成ライブラリを使用しています。

1

モッキングクラスの1つを試すことができます。最も簡単なアプローチは、あなたのクラスのサブクラスです。または、AOPを使用して必要なロギングコードを注入することもできます。

0

sun.misc.ProxyGeneratorを使用してプロキシクラスを生成することができ、 "interfaces"がすべてのインタフェースであることを確認しません。そのgenerateClassFileメソッドはバイト配列としてバイトコードを提供します。バイト配列を保存すると、将来のビルドにリンクしたり、サードパーティのツールで変更することができます。

「インターフェイス」に最終的なメソッドがある場合は、クラスを読み込もうとするとエラーが発生することに注意してください。

関連する問題