java - 如何向方面类中的建议变量添加一些值

标签 java events aspectj

这很奇怪,但我真的需要这个......我有这个代码

@Aspect
public class SomeAspect {

    SomeObject someObject = null;

    @Pointcut("something")
    public void somePoint() {
    }

    @Before("somePoint()")
    public void beforeSomePoint() {
    }

    @After("somePoint()")
    public void afterSomePoint() {
        someObject.hello();
    }

    public void waitForEvent(SomeEvent event) {
        someObject = event.getObject();
    }
}

所以基本上我有切入点和两个建议,我有一个方法正在监听在我的应用程序中触发的某个事件。我从我感兴趣的事件中获取对象,并在 waitForEvent 方法中初始化 someObject 变量。这有效,我确信 someObject 已正确传递到 waitForEvent 方法中。

重点是,我需要对在建议方法主体中获得的对象进行操作,例如 someObject.hello(),但在我看来,即使我知道在实际执行 afterSomePoint 建议之前触发了事件,它仍然为 null。

我没有使用 Spring 或任何其他相关框架。我使用的是纯Java + AspectJ,带注释的版本。

如何将一些对象从外部传递给建议

非常感谢

最佳答案

您好,您确定 someObj 仍然为空吗?

这是我的实验结果:

我将 someObject 更改为 String

@Aspect
public class SomeAspect {

    String someObject = null;

    @Pointcut("Call( * init(..) )")
    public void somePoint() {
    }

    @Before("somePoint()")
    public void beforeSomePoint() {
    }

    @After("somePoint()")
    public void afterSomePoint() {
        System.out.println(someObject);
    }

    public void waitForEvent(String event) {
        someObject = event;
    }
}

在我的主程序中:

public static void main(String[] args) {

SomeAspect a = Aspects.aspectOf(SomeAspect.class);
a.waitForEvent("Event!!");

Child c = new Child();
c.init(); //The advice will be triggered here!!

}

这样,afterSomePoint()通知被触发,并且“Event!!”打印出来

我认为您可以使用 Aspects.aspectOf(SomeAspect.class) 来获取方面实例,并将其传递给框架。如果您新建 SomeAspect,它将创建除 VM 中已有实例之外的另一个实例

引用:eclipse.org/aspectj/doc/next/progguide/semantics-aspects.html

Unlike class expressions, aspects are not instantiated with new expressions. Rather, aspect instances are automatically created to cut across programs. A program can get a reference to an aspect instance using the static method aspectOf(..)

关于java - 如何向方面类中的建议变量添加一些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645155/

相关文章:

java - 从文本文件读取并行数组

WPF 和 MVVM。绑定(bind)事件

javascript - 每次单击按钮时,我都想在两个功能之间切换

java - 使用切面劫持不同 servlet 中类的静态方法

java - 在 Java 中执行协整检验的代码

java - Java中的单元测试加解密

c# - 为什么 Visual Studio 设计器不希望我更改代码中的事件名称?

java - 在 Controller 中设置 "systems"属性并在某个方面访问该属性

java - Spring AOP 关于注解 Controller 的建议

java - TextView暂时不刷新