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さん、コメントありがとうございます。そして、混乱させて、済みません。