使用AspectJ公开上下文

时间:2013-06-11 19:32:51

标签: java aspectj pointcut

我知道我可以检索发送给方法的参数,但是如何才能获得该方法中定义的对象?例如,这是我的班级:

    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?

1 个答案:

答案 0 :(得分:3)

无法从方面建议的方法访问局部变量。这是因为局部变量不会通过任何连接点公开。

如果需要访问局部变量,则必须重构目标代码以便公开它们。你可以这样做:

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。如果您需要同时访问messagex,这仍然可以,但您需要使用虫洞模式来执行此操作。我可以解释这是否是你需要的。