2009-03-10 3 views
3

私はクラスAのオブジェクトを持っています。そのクラスのメソッドの1つをオーバーライドしたいと思います。これはできますか?Javaでは、オブジェクトを指定すると、メソッドの1つをオーバーライドできますか?

具体的には、フィールドに注入されているオブジェクトがあります。私はそれを使用する前に、メソッドの1つをオーバーライドする必要があります。

Reflectionが問題を解決するのに役立つかどうかを確認しようとしています。私がオーバーライドしようとしているメソッドは、そのクラスのプライベート変数に依存しないことに注意してください。

答えて

5

Dynamic Proxy classesを参照してください。

+0

これはafaikだけのインターフェイスで動作します。 –

+0

これは正しい答えではありません。インターフェイスでのみ機能します。つまり、オーバーライドしていない(つまり既存の)メソッドではありません。側面のような音だけが合理的なアプローチです。 – Robin

+0

彼は既にインターフェイスを使用している可能性が高いため、動的プロキシクラスを使用して、変更したい動作を変更し、変更したくない動作を実装に委任できます。 –

3

CGLIBは、あなたがしようとしていることを達成するのに役立つはずです。 Enhancer classをチェックしてください。

+0

エンハンサーには注意が必要です。これは、委任と継承の違いについて深刻な混乱があるためです。たとえば、 "enhanced"クラスがそのコンストラクタでインスタンスメソッドを呼び出さないようにするほうがよいでしょう。 – erickson

3

はい。

オーバーライドとは、新しいクラスを作成し、コンパイルし、新しいクラスを使用するように注入を変更し、残りのアプリケーションと一緒にパッケージ化することを意味します。もちろんそれはできますが、私はあなたがなぜ反射を望むのか分かりません。

これを動的なものにしたいのであれば、あなたはアスペクト指向プログラミングについて話しています。

3

オブジェクトが与えられているため、サブクラス化できないと仮定します。プロキシを記述することができます。オーバーライドするメソッドを除いて、すべてのメソッドを転送します。もちろん、元のオブジェクトへの他の参照はプロキシを使用しません。特に、オブジェクト自身が内部的にメソッドを呼び出す場合は、オーバーライドされたメソッドは使用されません。

また、AOPスタイルのハッキングを使用して、メソッドを呼び出すコードを書き換えたり、実装クラスを変更することもできます。

おそらく、あなたのデザインについて慎重に考える必要があります。

関連する問題