S2 AOP
とりあえず、簡単なexamples(examples.aop.DateProxy)を触ってみた。
変更点:
getTime以外に、equalsにもポイントカットを付けた。
確認用のコードを追加
public class DateProxy {
public static void main(String args) {
// change
//Pointcut pointcut = new PointcutImpl(new String{"getTime"});
Pointcut pointcut = new PointcutImpl(new String{"getTime", "equals"});
Aspect aspect = new AspectImpl(new TraceInterceptor(), pointcut);
AopProxy aopProxy = new AopProxy(Date.class, new Aspect{aspect});
Date proxy = (Date) aopProxy.create();
proxy.getTime();
// add
proxy.before(new Date());
proxy.equals(new Date());
proxy.getTime();
}
}
今回試してないけど、aopProxy.create()には、引数も指定できる。
結果:
以下の文字列が標準出力された。
BEGIN $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime()
END $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime() : 1083135227789
BEGIN $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime()
END $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime() : 1083135227789
BEGIN $java.util.Date$$EnhancerByCGLIB$$d863c36#equals(Wed Apr 28 15:53:47 JST 2004)
BEGIN $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime()
END $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime() : 1083135227789
END $java.util.Date$$EnhancerByCGLIB$$d863c36#equals(Wed Apr 28 15:53:47 JST 2004) : false
BEGIN $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime()
END $java.util.Date$$EnhancerByCGLIB$$d863c36#getTime() : 1083135227789
標準出力しているのは、TraceInterceptorがSystem.out.println()を使っているから。
BEGIN、ENDは、TraceInterceptorにハードコーディング。
その後ろは、クラス名が出ている。(java.util.Dateで終わって欲しいな)
#の後ろは、メソッド名。beforeはポイントカットしてないので、出力無し。
メソッド名の後ろの()には、引数が出力される。
その後ろに、 : (これも、TraceInterceptorにハードコーディング)をはさんで、メソッドの実行結果が出力。
疑問点:
equalsの中で、getTimeが使われてるので、それも出力されてる。=>OK
aopProxyからではなく、new Date()で作った方の結果も出力されてる。=>?
aopProxy.create();から作ったのと、普通にコンストラクタを呼んだ時の違いはある?
疑問解決:
proxy.before(new Date());は何も出力されないと思って、自分の頭の中から、この一行が消えていただけ。
proxy.equals(new Date());の行で、2つ出力されてる?と思い込んでいただけ。。。心より恥じる。
なので、proxy.getTime();、proxy.before()、proxy.equals()、proxy.getTime();の4回出力されてるので合っている。
equals()の前に出力されてる事をちゃんとチェックしとけば良かった・・・
OFF会に行ってて指摘される前に、書いとこうと思ったら、すでにコメントされてた。sugaさん、コメントありがとうございます。そして、混乱させて、済みません。