Aspectj可选参数绑定

时间:2015-06-24 12:35:42

标签: java aop aspectj

我希望Aspectj使用args绑定我的方法参数。

这样的事情:

    @Before("@annotation(authorized) && args(java.util.String)")
    public void authorize(JoinPoint joinPoint, Authorized authorized, String str)

但是,我不能指望存在的String参数。我希望将建议应用于使用该批注的所有方法,而不仅仅是带有String参数的方法。

如果建议的方法没有String参数,我希望str填充空值。 这可能吗?或者是使用joinPoint.getArgs()的唯一选择?

2 个答案:

答案 0 :(得分:1)

您可以使用getArgs(),另一种方法是创建委托给您要执行的功能的多条建议:

EventManager

注意我还包括一个执行切入点元素。包含它可能很重要。否则,如果使用纯AspectJ进行编译,没有它的切入点可能会匹配方法的调用和执行连接点,运行建议两次。

答案 1 :(得分:1)

我对安迪回答评论中提出的问题有一个答案:

  

是否可以使用未知数量的参数来建议方法,但不能以特定类型的参数结束?

package de.scrum_master.app;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Authorized {}
package de.scrum_master.app;

public class Application {
    @Authorized static void bla(String string, int i, int j) {}
    @Authorized static void baz(String string, int i, Integer integer) {}
    @Authorized static void zot(String string) {}
    @Authorized static void bar(Integer integer) {}
    @Authorized static void foo() {}

    public static void main(String[] args) {
        foo();
        bar(new Integer(11));
        zot("xxx");
        baz("yyy", 123, new Integer(22));
        bla("zzz", 123, 456);
    }
}
package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import de.scrum_master.app.Authorized;

@Aspect
public class MyAspect {
    @Before("@annotation(authorized) && execution(* *(..)) && !execution(* *(.., Integer))")
    public void authorize(JoinPoint joinPoint, Authorized authorized) {
        System.out.println(joinPoint);
    }
}

控制台输出:

execution(void de.scrum_master.app.Application.foo())
execution(void de.scrum_master.app.Application.zot(String))
execution(void de.scrum_master.app.Application.bla(String, int, int))

正如您所看到的,两个方法bazbar 以特定类型结尾 - 在此示例中为Integer - 从匹配中排除。