Java aspectj中的After()
我是aspectj的新手,我有一个函数,它获取整型变量并向其中添加100,如下所示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
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)之后的代码>是一个错误;-)