对象方面的AspectJ切入点不起作用

时间:2013-08-09 20:07:58

标签: java aspectj

我无法找出为什么我的切入点不起作用。编译器没有给出任何警告,所以我无法解释为什么它不起作用。我在maven javafx应用程序中使用了aspectjrt 1.7.2和aspectjtools 1.7.0。

我的方面看起来像这样

public privileged aspect MovieAspect perthis(MovieInit()) {

pointcut MovieInit(): execution(Movie.new(..));

pointcut reloadMainPanelView(): cflow(execution(void main.views.MainFrame.MainPanel.fillMainPanel(..)));

before(ArrayList tar): target(tar) && reloadMainPanelView() && call(void java.util.ArrayList.clear())
                       && !within(MovieAspect) {
    System.out.println("test");
}

我的MovieAspect位于包main.models

这里有一个关于我的代码中实际发生的事情的一点解释


当我的gui加载时,我初始化MainFrame类。就在此之前,另一个方面加载所有电影对象。然后,当MainFrame初始化MainPanel中的影片对象的视图时,它首先清除其视图对象并重新加载它们。因为我将所有这些视图添加为相应电影对象的监听器,我需要再次删除它们。当然我可以在调用ArrayList的clear方法之前做,但我真的想知道为什么切入点不起作用。 MovieAspect对象确实被实例化,我用MovieInit()切入点测试了它。


有没有人有线索,为什么这个切入点不起作用?实际上,同一个包中外部类的所有切入点都不起作用,除了Movie类中的那些。

希望有人可以提供帮助。

编辑:

这对电影级的所有构造者来说都是一个问题,但这并不重要。经过数小时的研究,我找到了解决方案。本文解释了这种行为

  

4.3.4隐含限制连接点

使用per-object或per-control-flow关联具有隐式的副作用 限制方面的建议只加入符合范围的点 方面实例。方面实例的范围是一组连接点 有一个与它们相关的方面实例。例如,对于percflow() 关联,方面实例的范围是内部发生的所有连接点 指定切入点的控制流程。这意味着即使为通知指定的切入点与连接点匹配,对该连接点的建议也不会 除非连接点也与方面的范围匹配,否则应用。这种副作用 当开发人员重构一个方面来创建可重用的部分时,通常会让开发人员感到惊讶 并且需要使用每个关联。 方面关联意味着某方面的建议将适用于加入 仅在以下情况下指出:

■对于perthis()关联,连接点的执行对象与 方面实例的关联对象。

■对于pertarget()关联,连接点的目标对象与 方面的相关对象。

■对于percflow()关联,连接点位于控件流中 方面的相关控制流程。

■对于percflowbelow()关联,连接点位于控制流下方 方面的相关控制流程。

1 个答案:

答案 0 :(得分:0)

你确定MovieInit()切入点捕获对电影构造函数的调用吗? 此Movie构造函数方法是默认构造函数还是用户定义的构造函数?