Java 使用AspectJ公开上下文
我知道我可以检索发送给某个方法的参数,但如何才能获取该方法中定义的对象?例如,这是我的班级:Java 使用AspectJ公开上下文,java,aspectj,pointcut,Java,Aspectj,Pointcut,我知道我可以检索发送给某个方法的参数,但如何才能获取该方法中定义的对象?例如,这是我的班级: public class Sample { public static void sendMessage(String message) { String x = "string x"; System.out.println(message); } public static void main(S
public class Sample {
public static void sendMessage(String message) {
String x = "string x";
System.out.println(message);
}
public static void main(String[] args) {
sendMessage("my message");
}
}
这就是我的观点:
public aspect SampleAspect {
pointcut printMessage(String m) : call(void Sample.sendMessage(..)) && args(m);
before(String m) : printMessage(m) {
System.out.println("Before sending: " + m);
}
after(String m) : printMessage(m) {
System.out.println("After sending: " + m);
}
}
输出由参数组成,因为我编写了&&args(m)
。
如何从sendMessage获取另一个字符串x?无法从方面建议的方法访问局部变量。这是因为局部变量不会通过任何连接点公开 如果您需要访问局部变量,那么您必须重构目标代码以使它们公开。您可以这样做:
public class Sample {
public static void sendMessage(String message) {
String x = getX();
System.out.println(message);
}
public static String getX() {
return "string x";
}
public static void main(String[] args) {
sendMessage("my message");
}
}
然后,您可以建议调用方法
getX
。如果您需要同时访问消息
和x
,这仍然是可能的,但您需要使用虫洞模式来实现。我可以解释这是否是您所需要的。无法从方面建议的方法访问局部变量。这是因为局部变量不会通过任何连接点公开
如果您需要访问局部变量,那么您必须重构目标代码以使它们公开。您可以这样做:
public class Sample {
public static void sendMessage(String message) {
String x = getX();
System.out.println(message);
}
public static String getX() {
return "string x";
}
public static void main(String[] args) {
sendMessage("my message");
}
}
然后,您可以建议调用方法
getX
。如果您需要同时访问消息
和x
,这仍然是可能的,但您需要使用虫洞模式来实现。如果这是您需要的,我可以解释。谢谢!假设我有一个堆栈,我必须使用AspectJ打印以控制其中的所有元素。每次我弹出一个元素时,我都会将它发送到一个空方法,比如:doNothing(stack.pop()),其中doNothing(..)有一个空的主体{}。我这样做是因为我想从一个方面访问元素。有更好的方法吗?为什么不建议调用stack.pop()?类似这样的内容:before(Stack s):call(*Stack.pop())&&target(s)&&withinCode()这听起来更好!再次感谢你!谢谢假设我有一个堆栈,我必须使用AspectJ打印以控制其中的所有元素。每次我弹出一个元素时,我都会将它发送到一个空方法,比如:doNothing(stack.pop()),其中doNothing(..)有一个空的主体{}。我这样做是因为我想从一个方面访问元素。有更好的方法吗?为什么不建议调用stack.pop()?类似这样的内容:before(Stack s):call(*Stack.pop())&&target(s)&&withinCode()这听起来更好!再次感谢你!