问题
I am able to get the signature and arguments from advised method calls, but I cannot figure out how to get the return values or exceptions. I'm kind of assuming that it can be done in some way using around and proceed.
回答1:
You can use after() returning
and after() throwing
advices as in beginning of the following document. If you're using @AspectJ syntax please refer to @AfterReturning
and @AfterThrowing
annotations (you can find samples here).
回答2:
You can also get return value using after returing advice.
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;
}
}
The defined aspect for getting return value:
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
}
回答3:
Using an around()
advice, you can get the return value of the intercepted method call by using proceed()
. You can even change the value returned by the method if you want to.
For instance, suppose you have a method m()
inside class MyClass
:
public class MyClass {
int m() {
return 2;
}
}
Suppose you have the following aspect in its own .aj file:
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;
}
}
来源:https://stackoverflow.com/questions/5656554/getting-a-return-value-or-exception-from-aspectj