AspectJ Weaver二传手模式问题

时间:2011-11-22 19:40:12

标签: java aspectj setter

我有一个“工作”的AspectJ Weaver模式,用于匹配特定类型(Item)中的所有setter:

public pointcut setter(Item item) :
    target(item)
    && execution(void Item+.set*(*));

它适用于所有潜在的setter,但它也匹配带有一个参数的“setup”等名称的方法。

所以我现在的解决方案是检查截取所有setter的方法,如果第4个字符是小写或不是(基于thisJoinPoint.getSignature()。getName()),并且基于不继续代码。

但是有没有更好的方法来排除“set”之后具有小写字符的所有方法?据我所知,正则表达式不是AspectJ模式的一部分,对吗?

2 个答案:

答案 0 :(得分:1)

是的,但还有其他方法可以解决这个问题。 如果您只是想避免设置方法,可以添加&& !execution(void Item + .setup(*))

你也可以使用丑陋的添加&&和!execution(void Item + .seta *())&& !execution(void Item + .setb (*))&& !execution(void Item + .setc *(*))等等......

或者,如果您对要避免的方法有所了解,可以添加this()或cflow()切入点。

答案 1 :(得分:1)

我不知道这是否不那么难看,但你可以引入一个注释@NoSetter并在另一个pointcut noSetter中使用它来排除setup(...)这样的方法你不希望应用这个方面:

public pointcut noSetter(Item item) :
target(item)
&& execution(void @NoSetter Item+.*(..));

修改切入点setter,如下所示:

public pointcut setter(Item item) :
target(item)
&& execution(void Item+.set*(*))
&& !noSetter();

我在使用setter方法触发某个事件的情况下使用了这种方法。我们无法生成代码并且手动执行此操作太繁琐且容易出错。此外,在一些制定者身上,事件明显不会被解雇。

[以上语法未经测试,现在没有IDE来验证]