Получение возвращаемого значения или исключения из AspectJ? - PullRequest
15 голосов
/ 14 апреля 2011

Я могу получить сигнатуру и аргументы от рекомендованных вызовов методов, но не могу понять, как получить возвращаемые значения или исключения. Я вроде как предполагаю, что это можно сделать каким-то образом, используя вокруг и продолжить.

Ответы [ 3 ]

14 голосов
/ 14 апреля 2011

Вы можете использовать after() returning и after() throwing советы, как в начале следующего документа .Если вы используете синтаксис @AspectJ, обратитесь к аннотациям @AfterReturning и @AfterThrowing (образцы можно найти здесь ).

7 голосов
/ 08 апреля 2014

Вы также можете получить возвращаемое значение, используя после получения совета.

package com.eos.poc.test;   

public class AOPDemo {
            public static void main(String[] args) {
                AOPDemo demo = new AOPDemo();
                String result= demo.append("Eclipse", " aspectJ");
           }
            public String append(String s1, String s2) {
                System.out.println("Executing append method..");
                return s1 + s2;
          }

}

Определенный аспект для получения возвращаемого значения:

public aspect DemoAspect {
    pointcut callDemoAspectPointCut():
        call(* com.eos.poc.test.AOPDemo.append(*,*));

    after() returning(Object r) :callDemoAspectPointCut(){
        System.out.println("Return value: "+r.toString()); // getting return value

    }
6 голосов
/ 17 июня 2013

Используя совет around(), вы можете получить возвращаемое значение перехваченного вызова метода, используя proceed(). Вы даже можете изменить значение, возвращаемое методом, если хотите.

Например, предположим, у вас есть метод m() внутри класса MyClass:

public class MyClass {
  int m() {
    return 2;
  }
}

Предположим, у вас есть следующий аспект в его .aj файле:

public aspect mAspect {
   pointcut mexec() : execution(* m(..));

   int around() : mexec() {    
     // use proceed() to do the computation of the original method
     int original_return_value = proceed();

     // change the return value of m()
     return original_return_value * 100;
   }
}
...