AspectJ Weaver setter模式问题



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

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

它适用于所有可能的setter,但它也匹配像"setup"这样只接受一个参数的方法。

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

但是有没有更好的方法来排除所有在"set"后面有小写字符的方法呢?据我所知,正则表达式不是AspectJ模式的一部分,对吧?

我不知道这是否不那么难看,但你可以引入一个注释@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方法需要触发某个事件的情况下使用了这种方法。我们无法生成代码,而且手工生成代码太繁琐,而且容易出错。此外,在某些setter上,事件被显式地完全不触发。

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

是的,但是还有其他方法可以解决这个问题。如果您只是想避免使用setup方法,您可以添加&&!执行(空白项+每次(*))

您也可以使用添加&&执行(void Item+.seta*()) &&执行(void Item+.setb(*)) &&执行(void Item+.setc*(*))等等…

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

最新更新