java - aspectj 中的 After()

标签 java aop aspectj

我是 aspectj 的新手,我有一个函数可以获取整数变量并将其加 100,如下所示

public static void add(int no)
    {
        no=no+100;


    }

我的方面如下

pointcut printMessage(int m) : execution(* add(..)) && args(m);
 after(int m) returning: printMessage(m) {
            System.out.println(m);
}

我用值 10 调用函数。但是当我运行代码时,它返回结果为 10。谁能告诉我为什么它不返回 110。如果我错了请纠正我

最佳答案

因为在 java 中 int 是不可修改的。如果你写

int i = 10;
add(i);
System.out.println(i);

您仍然会得到 10。因此,您的切面按照您的要求执行:您将一个值为 10 的变量传递给一个函数,该函数使用它的本地副本执行它想要的操作,然后返回变量不变

编辑:

如果你想获得一个修改后的值,你可以传递一个像数组这样的可修改变量,或者更简单地使用返回值(因为你当前的添加是一个无操作):

这里编辑 2 是完整的测试代码:

public class AspectTest {
    public static int add(int i) {
        return i+100;
    }

    @Test
    public void test() throws Exception {
        int j = add(10);
        assertEquals(110, j);
        add(20);
    }
}

和:

aspect A {
pointcut printMessage() : execution(* add(..));
 after() returning (int m): printMessage() {
            System.out.println(m);
}
}

输出:

Running ...AspectTest
110
120
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.214 sec

关于java - aspectj 中的 After(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26251068/

相关文章:

java - 无法掌握 Guice 方法拦截器的窍门(bindInterceptor 期间出现空指针异常)

java - 是否存在基于 AspectJ 的分析器包?

java - 如何使用 Spring 将 HttpSession 放入 Aspect 类中?

java - 切入点表达式 'abc(inString)' 包含不受支持的切入点原语 'call'

java - 创建实例的类数组

java - Mac 上带有 firefox-x11 的 WebDriver

java - 如何在不使用 spring AOP 的情况下创建代理

spring - 如何使用带注释的参数将参数传递给 Spring AOP 建议?

java - 将 spring XML 文件添加到类路径(Windows 命令行)

java - zip 文件的内容写入不正确