当前位置: 首页 > 知识库问答 >
问题:

对象方面中的AspectJ切入点不工作

虞承泽
2023-03-14

我就是不明白为什么我的切入点不起作用。编译器并没有给出任何警告,所以我无法解释它为什么不工作。我正在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");
}

我的电影方面位于包主要。模型

下面是对我的代码中实际发生的事情的一点解释

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

有人知道为什么这个切入点不起作用吗?实际上,在同一个包中的外部类上的所有切入点都不起作用,除了类中的切入点。

希望有人能帮忙。

编辑:

这对于电影类的所有构造函数来说都是一个陷阱,但这并不重要。经过几个小时的研究,我找到了解决办法。本文解释了这种行为

4.3.4连接点的隐式限制

使用每对象或每控制流关联的副作用是隐式地将方面中的通知限制为仅与方面实例的范围匹配的连接点。方面实例的范围是一组连接点,这些连接点具有与之关联的方面实例。例如,对于percflow()关联,方面实例的范围是发生在指定切入点的控制流内的所有连接点。这意味着,即使为通知指定的切入点与连接点匹配,对该连接点的通知也不会应用,除非连接点也与方面的范围匹配。当开发人员重构一个方面以创建可重用的部件并需要使用per-association时,这种副作用常常让他们感到惊讶。aspect关联意味着aspect中的建议仅在以下情况下适用于连接点:

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

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

对于Perperflow()关联,连接点位于方面的关联控制流的控制流中。

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

共有1个答案

丁英韶
2023-03-14

你确定MoviInit()切入点捕捉到调用电影构造函数?这个Movie构造函数方法是默认构造函数还是用户定义的构造函数?

 类似资料:
  • 在Spring中将一个方面配置为: 是: } 如果我使用注释实现方法,正在按预期工作。但是如果注释在接口上,它就不起作用。这是正常行为还是我做错了什么?

  • 问题内容: 我需要使用AspectJ向每个初始化的对象注入一些方法。 我以为是这样的: 指向对象的切入点初始化,因此我可以将这些方法直接注入到每个其他对象的对象中。 但是,它不起作用。你知道为什么吗?还是另一种方法可以如何100%确保每个初始化的对象都将成为切入点?* .new不适用于String,List等。 谢谢! 问题答案: 用户selig是正确的:您可能不想截取 所有 对象,尤其是JDK

  • 对象的切入点初始化,所以我可以直接将这些方法注入到作为每一个其他对象的一部分的对象中。 然而,它不起作用。你知道为什么吗?或者有什么其他方法可以100%地确保每个初始化的对象都是切入点?*.new不适用于字符串、列表等内容。 谢谢!

  • 我使用Spring的和注释来实现一个简单的CRUD-app,可以通过RESTful API使用。现在,我想在我的存储库上添加一个AspectJ切入点,这样每当调用接口中的CRUD-method时,就会执行一些功能。 首先,我扩展了Spring的,以便在自己的接口中添加一些自定义功能: 一切都很好,我可以通过REST客户端调用这个方法。我不必实现接口,因为Spring在后面的工作中是一个奇迹。这是扩

  • 问题内容: 我有针对特定软件包的此工作代码,但我想针对所有 controllers , service 和 dao 软件包进行配置 com.abc.xyz.content.controller com.abc.xyz.content.service com.abc.xyz.content.dao com.abc.xyz.category.controller com.abc.xyz.categor

  • 我想拦截所有java。sql。数据源。getConnection方法使用aspectj时,我使用了以下切入点: 它工作得很好。但我遇到了一些类,例如org。阿帕奇。公猫jdbc。水塘在该切入点不起作用的类层次结构中实现的数据源,其中数据源方法位于不实现数据源的层次结构中的类中,只有最顶层的类实现数据源: BaseDataSource不实现DataSource,但具有所有DataSource方法实现