1

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

@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()但在我看来,即使我知道在实际执行afterSomePoint建议之前触发了事件,它仍然为空。

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

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

十分感谢

4

2 回答 2

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!!

}

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

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

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

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

于 2013-07-17T13:47:20.193 回答
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();
    }
}
于 2013-07-15T00:36:27.237 回答