如何在 Java 中自动实现跟踪关注点



考虑向代码添加跟踪的常见问题。假设AspectJ或Spring AOP方法不是您想要做的事情 - 除了简单地手动添加跟踪之外,还有哪些其他方法可能?

据说Spoon或JavaParser是替代品,欢迎任何示例。

尝试了AspectJ,它运行良好,但是它的Maven插件支持不佳 - 试图让提交团队为Java 9+修复它。此外,鉴于当前的Java发布速度,我们不知道AspectJ将支持多长时间。

可以用勺子来做。 这是一个代码片段,它添加一个带有方法名称的System.out.println作为源代码位于./project/src中的类TheClass中的每个方法的第一条指令。生成的代码将存储在./project/generated中。

Launcher launcher = new Launcher();
launcher.addInputResource("./project/src/");
launcher.buildModel();
CtModel model = launcher.getModel();
List<CtType> filteredTypes = model.getElements(
(CtType type) -> type.getSimpleName().equals("TheClass"));
CtType functionsClass = filteredTypes.get(0);
Factory factory = launcher.getFactory();
for(CtMethod method : (Set<CtMethod<?>>)functionsClass.getMethods()) {
method.getBody().insertBegin(
factory.createCodeSnippetStatement(
"System.out.println("" + method.getSimpleName() +  "")"
));
}
JavaOutputProcessor processor = new JavaOutputProcessor(
new File("./project/generated"), launcher.createPrettyPrinter());
processor.setFactory(factory);
processor.createJavaFile(functionsClass);

如果可以针对编译的字节码,也可以考虑使用 Javsist。请参阅此处的示例 https://www.javassist.org/tutorial/tutorial.html

以下是Spoon和Javassist的一些示例,您可能会发现它们对您有所帮助 https://github.com/Software-Testing/code-manipulation

最新更新