arison.jp arison.jp blog - 現在をたのしく、未来をたのしむ。日常の思い出兼備忘録。

Seasar2のAOPを使用するときの問題点

Seasar2のAOPを使用するときの問題点

テストロジックを作成する場合にprivateメソッドを呼び出したい時があるわけで
クラスを取得し、メソッドを取得し、そのメソッドを外からでも呼び出そうとしていたわけです。

インターフェース「HogeLogicFacade」
実装クラス「HogeLogicFacadeImpl」
で、インターフェース「HogeLogicFacade」をgetNameした場合に
java.lang.NoSuchMethodException が発生。
なぜかというと

インターフェース「HogeLogicFacade」の実装クラス「HogeLogicFacadeImpl」をgetNameした場合に
実行時にはクラス名が「HogeLogicFacadeImpl$$EnhancedByS2AOP$$hhhhhhhh(hは16進数)」となる。

HogeLogicFacadeImplのAOPを含んだサブクラスHogeLogicFacadeImpl$$EnhancedByS2AOP$$hhhhhhhh。

private HogeLogicFacade hoge;
Class c = Class.forName(hoge.getClass().getName().replaceAll(“\\$\\$EnhancedByS2AOP\\$\\$\\w+$”,””));

こうすれば、元の実装クラス名の「HogeLogicFacadeImpl」が取得できる。
なんで、インターフェースと実装クラスのpublicメソッドがそろっているときには、正しくクラス名が取得できるのに
インターフェースと実装クラスのpublicメソッドがそろっていないときには、
$$EnhancedByS2AOP$$hhhhhhhh(hは16進数)がついてしまうのだろうか。
※インターフェースと実装クラスでpublicメソッドの数が異なることについての問題点は気にしないでください。

【追記】

原因がわかりました。
privateメソッドにアノテーションがついていて、AOPができるのは、publicメソッド。

privateメソッドをpublicに変更したことで、アノテーションが使われることになって
サブクラスHogeLogicFacadeImpl$$EnhancedByS2AOP$$hhhhhhhhが作成されてたわけでした。

【参考】
DWRでSeasar2のAOPを使用するときの問題点 – 俎上の鯉
http://d.hatena.ne.jp/masapon1967/20060831/1157086213
Seasar の中の中
http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=9&cad=rja&ved=0CGgQFjAI&url=http%3A%2F%2Fevent.seasarfoundation.org%2Fsc2008autumn%2FviewAttachment.do%3F_pageName_%3DSession%26_fileName_%3Dsc2008autumn_c3_javassist.pdf&ei=9GkdUpPxCoyGkQXUzoHoAw&usg=AFQjCNHZ0ptFNM-uuqnwz6xBs8FsJ16zJw&sig2=5oPh_YfsJMw3sN5SewlqCQ

About arison

大都会岡山の南部にある玉野市生まれ。 大都会岡山のIT会社(目標は大都会No.1)でコンピュータとお客を相手に日夜格闘中。 関東出張中はグルメブログ。 基本的に遊び人のおっさん。 ライフハックとガンダム好き。ギガフロート玉野を浸透中。

28. 8月 2013 by arison
Categories: プログラミング | Tags: , | Leave a comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください