使用注释的Java代码检测

时间:2011-03-29 10:07:35

标签: java instrumentation

我有一个包含大量代码的巨大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)

在我的日志文件中

你会如此善意地向我推荐一些工具吗?

史蒂夫

2 个答案:

答案 0 :(得分:3)

为了这个目的,我建议使用AspectJ。在这里,您可以找到如何定义相应PointCuts

的简短文档

答案 1 :(得分:2)

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

然后使用记录器记录它们