0

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

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

试过 AspectJ,它工作得很好,但它的 Maven 插件支持很差 - 试图让提交团队为 Java 9+ 修复它。此外,考虑到当前的 Java 发布速度,我们不知道 AspectJ 将被支持多长时间。

4

1 回答 1

1

用 Spoon 可以做到这一点。这是一个代码片段,它将System.out.println带有方法名称的 a 作为第一条指令添加到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

于 2019-09-12T08:10:36.923 回答