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()这听起来更好!再次感谢你!