[英]Java code instrumentation using annotations
我有一個包含大量代碼的巨大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
然后使用記錄器記錄它們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.