簡體   English   中英

使用注釋的Java代碼檢測

[英]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用於此目的。 在這里,您可以找到如何定義相應PointCuts的簡短文檔

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM