我有一个"工作"的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()切入点。