问题描述
我想将跟踪"消息添加到我所有的公共方法中,如下所示:
I would like to add "trace" messages to all my public methods as follows:
public void foo(s:String, n:int) { // log is a log4j logger or any other library
log.trace(String.format("Enter foo with s: %s, n: %d", s, n))
...
log.trace("Exit foo")
}
现在我想使用 AOP(和字节码检测)自动将所有这些 log.trace
添加到我的方法中.我在考虑 AspectJ
.是否有意义?您知道任何开源软件,它就是这样做的吗?
Now I would like to add all those log.trace
to my methods automatically with AOP (and byte code instrumentation). I am thinking about AspectJ
. Does it make sense? Do you know any open-source, which does exactly that?
推荐答案
我创建了一个简单的方面来捕获公共方法的执行.这段 AspectJ 代码的核心是切入点定义:
I have created a simple aspect to capture the execution of public methods. The core of this AspectJ code is the pointcut definition:
pointcut publicMethodExecuted(): execution(public * *(..));
在这里,我们捕获具有任意返回类型、任意包和任意类、任意数量参数的所有公共方法.
Here we are capturing all public methods with any return type, on any package and any class, with any number of parameters.
建议执行可以在下面的代码片段中可视化:
The advice execution could be visualized on code snippet below:
after(): publicMethodExecuted() {
System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());
Object[] arguments = thisJoinPoint.getArgs();
for (int i =0; i < arguments.length; i++){
Object argument = arguments[i];
if (argument != null){
System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);
}
}
System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());
}
此建议使用 thisJoinPoint 来获取方法签名和参数.就是这样.这是方面代码:
This advice use thisJoinPoint to get the method signature and arguments. And that's it. Here is the aspect code:
public aspect LogAspect {
pointcut publicMethodExecuted(): execution(public * *(..));
after(): publicMethodExecuted() {
System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());
Object[] arguments = thisJoinPoint.getArgs();
for (int i =0; i < arguments.length; i++){
Object argument = arguments[i];
if (argument != null){
System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);
}
}
System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());
}
对于更复杂的例子,我会推荐这本书 AspectJ: In行动.
For more complex examples I would recommend the book AspectJ: In Action.
这篇关于如何使用 AOP 和 AspectJ 进行日志记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!