使用注释的Java代码检测
作者:互联网
我有一个包含大量代码的巨大java项目.让我们假设它看起来像:
fn1(int arg1){...}
fn2(int arg1,int arg2){...}
fn23(){...}
...
fn134(){...}
我想使用注释记录每次函数调用:
@logme("arg1")
fn1(int arg1){...}
@logme("all args")
fn2(int arg1,int arg2){...}
fn23(){...}
...
fn134(){...}
并希望看到
fn1(arg1=223)
fn1(arg1=213,arg2=46)
在我的日志文件中
你会这么善意地向我推荐一些工具吗?
史蒂夫
解决方法:
您可以使用AspectJ&任何日志框架来处理这个要求,
所以你需要做以下事情:
1-创建你的注释,你可以根据自己的意愿获取参数,甚至可以获取一些未定义数量的参数,并像’arg1 = q,arg2 = w,arg3 = e’一样处理它们
2-在这样的新注释上创建一个带切点的方面
@Pointcut(value = "@annotation(loggableActivity)", argNames = "loggableActivity")
注意argNames在这里用来将注释本身发送给处理程序方法,所以你可以从它获取参数,如’arg1 = q,arg2 = w,arg3 = e’,并处理它们
3-在进行方法调用之前,记录你想要的内容,你可以从你的参数中获得几乎所有需要的信息,
注释代码如下所示:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LoggableActivity {
String value();
String args() default "";
}
切点代码看起来像:
@Aspect
public class ActivityLogger {
private static final Logger logger = LoggerFactory.getLogger("activity");
@Pointcut(value = "@annotation(loggableActivity)", argNames = "loggableActivity")
public void loggableUserActivity(LoggableActivity loggableActivity) {
}
@Around("loggableUserActivity(loggableActivity)")
public Object doLoggingUserActivity(ProceedingJoinPoint pjp,
LoggableActivity loggableActivity) throws Throwable {}
然后在doLoggingUserActivity里面你可以使用像
pjp.proceed(); proceed method call
pjp.getArgs(); gets method arguments
loggableActivity.args(); gets annotation argument as String
然后使用记录器记录它们
标签:java,instrumentation 来源: https://codeday.me/bug/20190903/1798219.html