2012-05-17 1 views
2

У меня есть AspectJ совет, чья pointcut - handler тип pointcut.AOP (AspectJ): Есть ли способ получить контекстные аргументы вложенного метода в рекомендации обработчика?

Вот метод, содержащий точки соединения я хочу посоветовать:

public void foo(String p1) { 
    try { 
     // some code 
    } 
    catch(Exception ex) { 
     // more code  
    } 
} 

Вот код в моем аспекте:

pointcut foopc(Exception ex) : handler(Exception) && args(ex) && withincode(public void foo(String)); 

before(Exception ex) : foopc(ex) { 
    // advice body 
} 

То, что я хотел бы, чтобы захватить переменную p1 и использовать его в пределах тела совета (в дополнение к исключению ex). Это возможно? Если да, то как мне это сделать?

ответ

0

Я считаю, что я понял это. Если у кого-то есть лучший ответ или более подходящий способ сделать это, я соглашусь на него.

код в аспекте:

pointcut fooExec(String p1) : 
    execution(public void foo(String)) && args(p1); 

pointcut fooHandler(String p1, Exception ex) : 
    cflow(fooExec(p1)) && handler(Exception) && args(ex) 
    && withincode(public void foo(String)); 

before(String p1, Exception ex) : fooHandler(p1, ex) { 
    // I can now use the variables p1 and ex. 
} 

EDIT:

Я должен отметить, что подпись в execution может быть просто * *(String), и два срезов в могли бы быть объединены в один, как это :

pointcut fooHandler(String p1, Exception ex) : 
    cflow(execution(* *(String) && args(p1))) 
    && handler(Exception) && args(ex) 
    && withincode(public void foo(String));