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

假设Spoon或JavaParser是替代方案,欢迎任何示例。

尝试过AspectJ,它工作得很好,但是其Maven插件的支持却很差-试图联系提交团队针对Java 9+对其进行修复。而且,鉴于当前的Java发布速度,我们不知道将支持AspectJ多长时间。

最佳答案

用Spoon可以做到。
这是一个代码片段,它向源代码位于System.out.println的类TheClass中的每个方法添加以方法名称作为第一条指令的./project/src。生成的代码将存储在./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);


如果可以将编译后的字节码作为目标,则也可以考虑使用Javassist。在此处查看示例https://www.javassist.org/tutorial/tutorial.html

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

07-24 18:26