2014-10-08 31 views
1

我是新來的AspectJ和我有一個功能,它得到了整型變量,並增加了100將其如下後()AspectJ中

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.糾正我,如果我錯了

回答

2

因爲在一個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 
+0

@ Serge ..我有什麼辦法可以得到110.是否必須使用Field-Access切入點。 – user3797438 2014-10-08 08:36:01

+0

@ user3797438:請參閱我的編輯 – 2014-10-08 08:54:14

+0

但我得到相同的值... 10 – user3797438 2014-10-08 09:01:27

1

下面是塞爾貝勒斯特的示例代碼變種,這使得它更清楚發生了什麼在Java中。原始類型如int是不可改變的,但即使是一些簡單的內置對象類型,例如String也是如此。雖然更復雜的類型,如Set不是。

不同add方法驅動應用:

package de.scrum_master.app; 

import java.util.HashSet; 
import java.util.Set; 

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

    public static String add(String text) { 
     text = "#" + text + "#"; 
     return text; 
    } 

    public static Set<String> add(Set<String> set) { 
     set.add("new element"); 
     return set; 
    } 

    public static void main(String[] args) { 
     add(10); 
     add("foo"); 
     Set<String> mySet = new HashSet<>(); 
     mySet.add("foo"); 
     mySet.add("bar"); 
     add(mySet); 
    } 
} 

方面捕捉所有add方法,打印他們的參數和結果進行比較:

package de.scrum_master.app; 

public aspect MyAspect { 
    pointcut addMethods(Object parameter) : 
     execution(* add(*)) && args(parameter); 

    after(Object parameter) returning (Object returnValue): addMethods(parameter) { 
     System.out.println(thisJoinPoint); 
     System.out.println(" parameter = " + parameter); 
     System.out.println(" return value = " + returnValue); 
    } 
} 

控制檯輸出:

execution(int de.scrum_master.app.Application.add(int)) 
    parameter = 10 
    return value = 110 
execution(String de.scrum_master.app.Application.add(String)) 
    parameter = foo 
    return value = #foo# 
execution(Set de.scrum_master.app.Application.add(Set)) 
    parameter = [new element, foo, bar] 
    return value = [new element, foo, bar] 

正如你所看到的,intString參數保持不變,而Set參數是可變的,因此更新。