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


Java

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


あなたの「いいね」が欲しいです。
「Seasar2のAOPを使用するときの問題点」をシェアする
 
 このエントリーをはてなブックマークに追加  LINE  
 はてなブックマークやLINEでシェアされると、よろこびます。 
 

コメントを残す

メールアドレスが公開されることはありません。

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