在AspectJ的世界里,切点扮演着关键角色,它们是程序流中特定执行点的抓取器。例如,"call(void Point.setX(int))"这个切点,专门捕捉那些调用Point类中接收一个整数参数并返回void的setX方法的执行点。切点通过逻辑运算符如"||"(或)、"&&"(与)和"!"(非)进行组合,如"call(void Point.setX(int)) || call(void Point.setY(int))",可以捕获setX或setY方法的调用。
更进一步,切点可以跨越类型限制,如"call(void FigureElement.setXY(int,int)) || call(void Point.setX(int)) || call(void Point.setY(int)) || call(void Line.setP1(Point)) || call(void Line.setP2(Point))",它可以捕获包括FigureElement移动相关操作在内的多个方法调用的集合。
AspectJ允许程序员为这些切点命名,如"pointcut move(): call(void FigureElement.setXY(int,int)) || call(void Point.setX(int)) || call(void Point.setY(int)) || call(void Line.setP1(Point)) || call(void Line.setP2(Point))",这样在后续代码中,只需调用命名的切点,无需再次描述复杂的匹配条件。
除了基于名称的切点,AspectJ还提供了基于属性的切点,如"call(void Figure.make*(..))",能匹配Figure对象中以"make"开始的任意方法,或者"call(public & Figure.*(..))",匹配Figure对象中的任何公开方法。切点的定义还可以利用AspectJ的其他特性,比如"cflow(move())",它会追踪被move切点捕获的执行点在其动态上下文中发生的连接点。
综上,AspectJ的切点是一种强大的工具,它允许开发者以灵活的方式定义和管理程序执行的关键点,简化了代码管理和通知机制。
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。