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

时间:2013-07-15 00:26:15

标签: 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();
    }
}

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

关键是我需要对像someObject.hello()这样的建议方法体中的那个对象进行操作,但在我看来它仍然是null,即使我知道事件在实际执行之前被触发了afterSomePoint建议。

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

如何将一些对象传递给来自外部的建议?

非常感谢

2 个答案:

答案 0 :(得分:1)

嗨,你确定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!!

}

这样,触发了SomePoint()建议后,“Event !!”打印出来

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

参考:eclipse.org/aspectj/doc/next/progguide/semantics-aspects.html

  

与类表达式不同,方面不是用new实例化的   表达式。而是自动创建方面实例以进行剪切   跨程序。程序可以获取对方面实例的引用   使用静态方法aspectOf(..)

答案 1 :(得分:0)

哦,这很有趣......

我刚刚将该变量设为静态,它似乎有效。这有点神奇吗?这是怎么做的?还有其他办法吗?

@Aspect
public class SomeAspect {

    private static SomeObject someObject = null;

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

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

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

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