使用Java注释在方法中生成一些代码

时间:2018-06-21 22:56:46

标签: java annotations code-generation

我将注释Java方法,以便在执行方法主体之前和方法返回给调用者之前运行一些代码。我在编译时使用Java注释了解了代码生成

我要注释的方法的签名如下例所示。

public Output process(Input arg0) {
    // ...
    // body that creates output object as processing result of arg0
    // ...
    return output;
}

我将对上述方法进行注释,以便在执行方法主体之前记录输入参数,并在方法返回调用者之前记录输出数据。

我假设一个注释如下。

@Log(input = "arg0", inputDest = "log1.txt", outputDest = "log2.txt")

上面的注释应该(在编译时)生成类似以下的代码。

public Output process(Input arg0) {
    SampleLogger.log(arg0, "log1.txt");   // <-- generated code
    // ...
    // body that creates Output object as processing result of arg0
    // ...
    SampleLogger.log(output, "log2.txt");   // <-- generated code
    return output;
}

如何实现?

1 个答案:

答案 0 :(得分:0)

是的,可以。但是您不应该使用编译代码生成。如上所述,project lombok在编译期间进行了这种生成。但这是把戏。它使用了许多私有API,这使项目变得复杂且难以维护。

您真正需要的是进入方法调用,以便您可以增强方法的实现。这就是AOP所做的。

对于您的需求,有许多库可以做到。例如CglibAspectJSpring AOP。这里给您一个简单的Cglib示例

  public static void main(String[] arg) {
    YourClass actualInstance = new YourClass();
    YourClass instanceToUse = (YourClass) Enhancer.create(YourClass.class, (MethodInterceptor) (obj, method, args, proxy) -> {
      System.out.println("enter the method: " + method.getName());
      Object result = method.invoke(actualInstance, args);
      System.out.println("exit the method: " + method.getName());
      return result;
    });
    instanceToUse.process();
  }

  public static class YourClass {
    public Object process() {
      System.out.println("do something");
      return new Object();
    }
  }