使用AspectJ捕获使用类型作为参数进行的任何调用

时间:2011-08-29 21:55:01

标签: java aspectj

我正在尝试使用AspectJ规范化应用程序中的URI。我想捕获对传入java.net.URI参数的方法的每次调用。

一个简单的切入点就像这样:     public pointcut uriMethod(URI uri):call(* *(..))&& ARGS(URI);

但是,这似乎只匹配只有一个参数(URI)的方法签名。我可以将args部分更改为“args(uri,..)”,但这仅适用于具有多个参数的方法(丢失单参数签名),并且仅适用于第一个参数是URI。

是否可以构建一个切入点来覆盖所有情况:     public void exampleMethod1(URI uri);     public void exampleMethod2(URI uri,String s);     public void exampleMethod3(int i,URI uri);     public void exampleMethod4(float f,URI uri,short s);

如果可以使用相同的切入点捕获多个URI,则获得奖励积分:     public void exampleMethod5(URI uri1,URI uri2);

我也对替代路线持开放态度。也许我需要基于URI类本身的东西,而不是传递给它的类?

1 个答案:

答案 0 :(得分:1)

此切入点表达式将满足您的第一个条件:

execution(* *(..,java.net.URI,..))

然后在建议中,使用joinpoint浏览args,获取带有URI作为实例的arg - 这种类型满足您的第二个条件:

    @Around("methodsWithURI()")
public void aroundMethodsWithURI(ProceedingJoinPoint joinpoint){
    for(Object objArg: joinpoint.getArgs()){
        if (objArg instanceof URI){
            System.out.println(objArg);
        }
    }
}