Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java aspectj中的After()_Java_Aop_Aspectj - Fatal编程技术网

Java aspectj中的After()

Java aspectj中的After(),java,aop,aspectj,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.print

我是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);
}
我的观点如下

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分。因此,aspect会按照您的要求执行:您将一个值为10的变量传递给一个函数,函数使用其本地副本执行它想要的操作,并且在返回时该变量保持不变

编辑:

如果希望获得修改后的值,可以像数组一样传递一个可修改的变量,或者更简单地使用返回值(因为当前的add是no op):

编辑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

下面是Serge Ballesta示例代码的一个变体,它使Java中发生的事情更加清晰。像
int
这样的基本类型是不可变的,但即使是像
String
这样的简单内置对象类型也是不可变的。但是,像
Set
这样更复杂的类型则不是

具有不同
添加方法的驱动程序应用程序:

package de.scrum\u master.app;
导入java.util.HashSet;
导入java.util.Set;
公共类应用程序{
公共静态整数添加(整数i){
i+=100;
返回i;
}
公共静态字符串添加(字符串文本){
text=“#”+text+“#”;
返回文本;
}
公共静态集合添加(集合){
设置。添加(“新元素”);
返回集;
}
公共静态void main(字符串[]args){
增加(10);
添加(“foo”);
Set mySet=newhashset();
mySet.add(“foo”);
mySet.add(“bar”);
添加(mySet);
}
}
方面捕获所有
添加
方法,打印其参数和结果以供比较:

package de.scrum\u master.app;
公共方面我的方面{
切入点添加方法(对象参数):
执行(*添加(*)和&args(参数);
返回(对象参数)后(对象返回值):addMethods(参数){
System.out.println(此连接点);
System.out.println(“参数=”+参数);
System.out.println(“return value=“+returnValue”);
}
}
控制台输出:

执行(int de.scrum\u master.app.Application.add(int))
参数=10
返回值=110
执行(String de.scrum_master.app.Application.add(String))
参数=foo
返回值=#foo#
执行(Set de.scrum_master.app.Application.add(Set))
参数=[新元素,foo,bar]
返回值=[新元素,foo,bar]

如您所见,
int
String
参数保持不变,而
Set
参数是可变的,因此会更新。

但我得到的是相同的值。。。10@user3797438我提议的方面中有语法错误。。。后期编辑。在我自己的测试中,我得到了110(具有正确的方面),但我写了
after()
returning(int m)
<(int m)之后的代码>是一个错误;-)