2013-04-12 10 views
17

私はいくつかのレガシーコードで静的メソッドを持っています。これは複数のクライアントから呼び出されます。私はそれを無効にするオプションや、依存性注入によって動作を変更するオプションはないことは明らかです。私は既存のクラスを変更することはできません。リフレクションによるメソッドの動作を変更するにはどうすればよいですか?

私が今したいことは、リフレクションを使用して(そのシグネチャと戻り値の型で)その動作を変更することです。

可能ですか?もしそうでなければ、どんなデザインパターンも私を救うことができますか?

ありがとうございます!

EDIT:私は何を変更/変更できるかについていくつかの混乱があります。既存のクラス/メソッドは変更できませんが、プロジェクトにクラスを追加できます。既存のクラスでできることは、そのクラスに注釈を付けることです。これは、既存のコードで何かを壊すのを避けるために行われます。つまり、大きなプロジェクトのための完全なテストです。

EDIT 2:Androidではjava.lang.Instrumentationは利用できません。

+0

なぜ反射? –

+3

あなたはそれを変更することはできませんが、あなたはリフレクションによって変更することができますか?それはもっと危険なようです。 – Keppil

+0

これはメンテナンスの悪夢に終わると思います。コードはそれを読んだ誰かに横たわっています。行って、そのクラスを変更する承認を得てください。 – SpaceTrucker

答えて

18

は奇妙な要件...とにかく

ような音、反射あなたは、コードの動作を変更することはできません、それが唯一のフィールド値、物事のようなものを変更する、方法およびconstuctorsを呼び出し、現在のコードを探索することができます。

実際にメソッドの動作を変更する場合は、ASMなどのバイトコード操作ライブラリを使用する必要があります。クラスは、最終的なものではなく、あなたがクライアントを変更することができた場合は、

  • 既存のクラスを拡張して:しかし、これは...おそらく、あなたを助けるかもしれない

    パターンは良いアイデアは非常に簡単ではないではありません目的の動作でメソッドをオーバーロードします。編集:メソッドが静的でない場合にのみ動作します!

  • アスペクトプログラミング:とにかくAspectJの

を用いた方法にインターセプタを追加し、実行する最も論理的なことは、既存のクラスを変更する方法を見つけることであろう、回避策は、ちょうどあなたのコードはより複雑になり、維持することをより困難にする。

幸運。

+0

静的メソッドはオーバーライドできません。反射がフィールド値を変えることができるのではないかと私は思っています。 – SlowAndSteady

+0

私はAOPを初めて使っています。今すぐ探検! – SlowAndSteady

+0

もちろん静的なメソッドについては正しいです。私はそれに応じて私の答えを編集しました。 –

8

InstrumentationクラスのメソッドredefineClasses(ClassDefintion classDefinition)をご覧ください。

再定義によって、メソッド本体、定数プールおよび属性が変更されることがあります。再定義では、フィールドやメソッドの追加、削除、名前の変更、メソッドのシグネチャの変更、継承の変更を行わないでください。

これが役に立ちます。

参考文献:Javadoc

+0

申し訳ありません、これをAndroidに追加するのを忘れました。私はこのクラスを利用できません:( – SlowAndSteady

関連する問題