这很奇怪,但我真的需要这个...我有这个代码
@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,带注释的版本。
如何将一些对象传递给来自外部的建议?
非常感谢
答案 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();
}
}