アノテーションをコーディングの中心に(2)

前回のつづき、、、

以下、任意のアノテーション

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * MyTarget.java
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTarget{
   String value();
}

このアノテーションを付与したメソッドの実行をインターセプトしようとする。

前回の AopProcessor を Google guice のインジェクタ生成で渡す。

JSR-305 の@MatchesPattern インターセプト対象メソッドのパラメータに付いていて
パターンマッチ検証してNGならメソッドを実行しないようにするのが
以下である

Injector injector = Guice.createInjector(new AopModule(MyTarget.class,new AopProcessor(){
   @Override
   public boolean preMethod(List<Annotation> mas,List<List<Annotation>> pas,Object[] paramValues){


      MatchesPattern mptn = (MatchesPattern)pas.get(1).get(0);
      if (paramValues[1] != null){
         if (new MatchesPattern.Checker().forConstantValue(mptn,paramValues[1])
             .equals(When.ALWAYS)){
            return true;
         }
      }
      return false;
   }
   @Override
   public void finish(Object value){
      System.out.println("# preMethod  value = "+value);
   }
}
));

// TargetA というクラスのexecメソッドに@MyTarget が付いていて
// 引数に @MatchesPattern が付いているとすると、、、
TargetA ta = injector.getInstance(TargetA.class);
ta.exec("test","100");
これで。AOPModule に渡した AopProcessor のメソッドが動く