あるクラスの、1部のメソッドをフックして処理を追加する必要があるため、ラッパークラスを作成したのですが、メソッド数が非常に多く、また頻繁に変更のあるクラスなので、そのたびに変更を加えるのが大変なのですが、何かよい方法は無いでしょうか。
ちなみOSSの使用が制限されているため、SpringのMethodInterceptor等は使用できません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
対象のクラスがインターフェースを実装しているのであれば、Proxyを使用すれば目的が達成できるかも知れません。
実装はこんな感じでしょうか。
lang
1Class<?>[] if = new Class<?>[] { Interface.class }; 2Interface proxied = (Interface) Proxy.newProxyInstance(Target.class.getClassLoader(), if, 3 new InvocationHandler() { 4 public Target delegate = new Target(); 5 public Object invoke(Object proxy, Method method, Object[] param) throws Throwable { 6 if (StringUtils.equals(""target_proc"", method.getName())) { 7// 処理1 8 } else { 9// 処理2 10 } 11 } 12 });
もしインターフェースを実装していない場合は、せめてCGLIBだけでも使用することができればIntrerfaceMakerやEnhancerで上記のような処理を実現できます(使用方法は割愛します。。)
投稿2014/09/19 05:29
総合スコア87
0
委譲ではなく派生でいけるなら苦労はないでしょうがそうできない理由があるのだと思います。もし標準的なJava開発環境の機能だけを使う前提で考えるなら、そのクラス専用の委譲クラス自動生成アノテーションを開発するのはどうでしょうか。
例えばpackage-info.javaに書くようなGeneratedDelegatedClassをこしらえ、
lang
1@GenerateDelegatedClass(name="MyDelegatedClass", original=jp.foo.OriginalClass.class) 2package targetpackage;
のように書いておくとオリジナルクラスの一部のメソッドだけをフックし他のメソッドは全部単純にdelegationするようなクラスソースを自動生成してくれるというような。
このアノテーション仕様そのものは汎用性もなく筋がわるいのですが、逆に考えればSpringのような汎用品でないだけにそれほどの手間をかけずに作れる気がします。
オリジナルクラスの変更に伴う委譲クラスの手直しの工数 >> アノテーション開発工数
であることが必要条件ですが、左辺には「工数」だけではなく「精神的苦痛」も入れたいところです。
投稿2014/09/13 05:08
総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。