【问题标题】:Using Java annotations to generate some code within a method使用 Java 注释在方法中生成一些代码
【发布时间】:2018-06-22 12:00:56
【问题描述】:

我会注解一个 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;
}

如何做到这一点?

【问题讨论】:

  • 你试过什么?你的研究是什么?我只看到需求,而不是尝试解决方案。因此,这个问题太宽泛了,因为有任何方法可以实现这一目标。
  • 对于记录器功能对我来说似乎有点矫枉过正。为什么普通的旧 AOP 不起作用?方面J?它也适用于注释,顺便说一句。

标签: java annotations code-generation


【解决方案1】:

是的,你可以。但是你不应该使用编译代码生成。正如上面提到的评论,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();
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多