我将注释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;
}
如何实现?
答案 0 :(得分:0)
是的,可以。但是您不应该使用编译代码生成。如上所述,project lombok
在编译期间进行了这种生成。但这是把戏。它使用了许多私有API,这使项目变得复杂且难以维护。
您真正需要的是进入方法调用,以便您可以增强方法的实现。这就是AOP所做的。
对于您的需求,有许多库可以做到。例如Cglib
,AspectJ
,Spring 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();
}
}