gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:22:20 25 4
gpt4 key购买 nike

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

如何实现这一目标?

最佳答案

是的,可以。但您不应该使用编译代码生成。正如上面的评论提到的,project lombok 在编译期间进行了这样的生成。但这是诡计。它使用了太多的私有(private)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();
}
}

关于java - 使用 Java 注释在方法中生成一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50978487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com