我有一个“工作”的AspectJ Weaver模式,用于匹配特定类型(Item)中的所有setter:
public pointcut setter(Item item) :
target(item)
&& execution(void Item+.set*(*));
它适用于所有潜在的setter,但它也匹配带有一个参数的“setup”等名称的方法。
所以我现在的解决方案是检查截取所有setter的方法,如果第4个字符是小写或不是(基于thisJoinPoint.getSignature()。getName()),并且基于不继续代码。
但是有没有更好的方法来排除“set”之后具有小写字符的所有方法?据我所知,正则表达式不是AspectJ模式的一部分,对吗?
答案 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来验证]