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