AspectJ:拦截 return 方法在另一个方法中的结果
AspectJ: Intercept return result of method inside another method
我需要帮助写一些关于这个特殊情况的 Aspectj 建议:
假设我们有这个 class:
package org.group;
public class Person {
public void method1(String id, String number) {
//some code
List<String> list = getList(number);
//some code
}
public List<String> getList(String number) {
return Arrays.asList(number);
}
}
我想在 method1 中创建一个 Aspectj 通知以获取 getList 的结果。我试试这个:
@Pointcut("execution(* org.group.Person.getList(..))")
public void methodGetList() {
}
@AfterReturning(pointcut = "methodGetList()", returning = "result")
public void afterMethodGetList(JoinPoint joinPoint, List<String> result) {
System.out.println("I can see the list result: " + result.toString());
}
此建议适用于 getList 方法的所有执行,但我真正想要的是在 method1 调用中获取结果以获取包含 method1 的 id 的信息,例如:
'我可以看到 ID 为 XXX'
的人的列表结果 [4]
感谢您的帮助。
您需要将切入点限制为调用方法的控制流内的执行 - cflow()
- 并通过 args()
.
绑定调用方法的相关参数
申请:
package org.group;
import java.util.Arrays;
import java.util.List;
public class Person {
public void method1(String id, String number) {
// some code
List<String> list = getList(number);
// some code
}
public List<String> getList(String number) {
return Arrays.asList(number);
}
public static void main(String[] args) {
// Should not be intercepted
new Person().getList("22");
// Should be intercepted
new Person().method1("John Doe", "11");
}
}
看点:
package de.scrum_master.aspect;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut("execution(* org.group.Person.getList(..))")
public void methodGetList() {}
@Pointcut("execution(* org.group.Person.method1(..)) && args(id, *)")
public void methodMethod1(String id) {}
@AfterReturning(
pointcut = "methodGetList() && cflow(methodMethod1(id))",
returning = "result"
)
public void afterMethodGetList(JoinPoint joinPoint, String id, List<String> result) {
System.out.println(
"I can see the list result " + result +
" for the person with id " + id
);
}
}
控制台日志:
I can see the list result [11] for the person with id John Doe
我需要帮助写一些关于这个特殊情况的 Aspectj 建议:
假设我们有这个 class:
package org.group;
public class Person {
public void method1(String id, String number) {
//some code
List<String> list = getList(number);
//some code
}
public List<String> getList(String number) {
return Arrays.asList(number);
}
}
我想在 method1 中创建一个 Aspectj 通知以获取 getList 的结果。我试试这个:
@Pointcut("execution(* org.group.Person.getList(..))")
public void methodGetList() {
}
@AfterReturning(pointcut = "methodGetList()", returning = "result")
public void afterMethodGetList(JoinPoint joinPoint, List<String> result) {
System.out.println("I can see the list result: " + result.toString());
}
此建议适用于 getList 方法的所有执行,但我真正想要的是在 method1 调用中获取结果以获取包含 method1 的 id 的信息,例如:
'我可以看到 ID 为 XXX'
的人的列表结果 [4]感谢您的帮助。
您需要将切入点限制为调用方法的控制流内的执行 - cflow()
- 并通过 args()
.
申请:
package org.group;
import java.util.Arrays;
import java.util.List;
public class Person {
public void method1(String id, String number) {
// some code
List<String> list = getList(number);
// some code
}
public List<String> getList(String number) {
return Arrays.asList(number);
}
public static void main(String[] args) {
// Should not be intercepted
new Person().getList("22");
// Should be intercepted
new Person().method1("John Doe", "11");
}
}
看点:
package de.scrum_master.aspect;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut("execution(* org.group.Person.getList(..))")
public void methodGetList() {}
@Pointcut("execution(* org.group.Person.method1(..)) && args(id, *)")
public void methodMethod1(String id) {}
@AfterReturning(
pointcut = "methodGetList() && cflow(methodMethod1(id))",
returning = "result"
)
public void afterMethodGetList(JoinPoint joinPoint, String id, List<String> result) {
System.out.println(
"I can see the list result " + result +
" for the person with id " + id
);
}
}
控制台日志:
I can see the list result [11] for the person with id John Doe