我有两个匹配相同切入点的建议。他们应该一个接一个地进行。例如:
pointcut som(TargetClass t, CallingClass c): target(t) && this(c) && call(public * TargetClass .*(..) );
before(TargetClass t, CallingClass c): som(t, c)
{
System.out.println("Entering: " + thisJoinPoint);
String identifier = <...>; //Generating unique identifier for a method call
getMonitor().addRecord(identifier, new Date()); //Sending new record to a custom monitor object
}
after(TargetClass t, CallingClass c): som(t, c) returning
{
getMonitor().finishRecord(identifier, new Date());
}
这就是我一般看待逻辑的方式。问题是如何在“之后”建议中提供“之前”建议中创建的变量。我不太了解ApsectJ来解决这个问题。
答案 0 :(得分:1)
这是Stefan回答的更正版本(抱歉,由于格式化代码,我无法将其发布为评论):
public aspect MyAspect {
pointcut som(TargetClass t, CallingClass c) :
target(t) && this(c) && call(public * TargetClass .*(..) );
Object around(TargetClass t, CallingClass c) : som(t, c) {
System.out.printf("%s%n this = %s%n target = %s%n", thisJoinPoint, c, t);
String identifier = UUID.randomUUID().toString();
getMonitor().addRecord(identifier, new Date());
Object result = proceed(t, c);
getMonitor().finishRecord(identifier, new Date());
return result;
}
}
around()
建议需要与切入点匹配的返回类型,或者由于缺乏更好的知识,Object
。proceed()
的参数列表必须与建议的参数列表一致。void
,否则您需要返回proceed()
的结果(已修改或未更改,或者甚至是相同类型的完全不同的对象替换原始对象)。如果您总是想要返回另一个对象并停止原始方法的完全执行,您甚至可以跳过proceed()
。