Ответ 1
Вы можете использовать советы after() returning
и after() throwing
, как в начале следующий документ. Если вы используете синтаксис @AspectJ, обратитесь к аннотациям @AfterReturning
и @AfterThrowing
(вы можете найти образцы здесь).
Я могу получить сигнатуру и аргументы из рекомендуемых вызовов методов, но я не могу понять, как получить возвращаемые значения или исключения. Я вроде бы предполагаю, что это может быть сделано каким-то образом, используя и продолжайте.
Вы можете использовать советы after() returning
и after() throwing
, как в начале следующий документ. Если вы используете синтаксис @AspectJ, обратитесь к аннотациям @AfterReturning
и @AfterThrowing
(вы можете найти образцы здесь).
Вы также можете получить возвращаемое значение с помощью после сохранения.
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
}
Используя совет 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;
}
}