2013-06-11 51 views
0

我知道我可以檢索發送給方法的參數,但是如何獲取在該方法中定義的對象?例如,這是我的課:使用AspectJ公開上下文

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?

回答

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,這仍然是可能的,但您需要使用蟲洞模式才能這樣做。我可以解釋,如果這是你需要的。

+0

謝謝!假設我有一個堆棧,並且必須使用AspectJ打印來控制它的所有元素。每次我彈出一個元素時,我都會將其發送到一個空方法,如下所示:doNothing(stack.pop()),其中doNothing(..)具有空體{}。我這樣做是因爲我想從一個方面訪問元素。有沒有更好的辦法? – Sorin

+0

爲什麼不建議調用stack.pop()?像這樣:before(Stack s):call(* Stack.pop())&& target(s)&& withinCode() –

+0

這聽起來好多了!再次感謝你! – Sorin