前回のつづき、、、
以下、任意のアノテーション
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 のメソッドが動く