鉴于这些切入点来自以下资源:

http://maverick-amey.blogspot.ru/2007/12/using-cflow-and-cflowbelow-in-pointcuts.html

pointcut methodCalls() :
                     call(public void Foo.*(..)) ;

pointcut methodCallFromWebTier() :
                     methodCalls() && cflow(call(* com.webtier.*+.*(..)));


methodCallFromWebTier切入点应该将对Foo类的任何公共方法进行的所有调用与任何返回void的参数进行匹配,前提是(&&运算符)该调用在对方法的任何调用的控制流之内的:


com.webtier包中的任何类(及其子类);
com.webtier包中的任何抽象类(其子类);
com.webtier包中任何接口的com.webtier包中的任何接口实现;


现在,如果切入点是这个:

pointcut methodCallFromWebTier() :
                     methodCalls() && cflow(call(* com.webtier.*.*(..)));


因此,如果没有+子类型TypePattern运算符,切入点是否相同?我的意思是,只要所有内容都在com.webtier包内,它仍然匹配所有内容(任何类,抽象类子类,接口实现),因此我在这里看不到+号的用法...

我错了吗?有一些我可能看不到的极端情况吗?

在此示例中,加号真的必要吗?

感谢您的关注!

最佳答案

如果使用的类型在com.webtier包中子类型化但不在com.webtier包中,则加号会有所不同。加号表示在计算cflow时还将考虑这些类型。如果在您的应用程序中没有发生这种情况,那么加号不会有任何区别。

您的Foo类是否在com.webtier包中,这也有所不同。如果是,则对它的调用始终在call(* com.webtier.*+.*(..))的cflow中。如果是这种情况,我可能会使用cflowbelow而不是cflow

07-24 19:25