如何在 Java 中自动执行跟踪关注点
How to automate tracing concern implementation in Java
考虑向您的代码添加跟踪的常见问题。假设 AspectJ 或 Spring AOP 方法不是您想要做的事情 - 除了简单地手动添加跟踪之外,还有哪些其他方法是可能的?
据说 Spoon 或 JavaParser 是替代品,欢迎提供任何示例。
尝试过 AspectJ,它工作得很好,但是它的 Maven 插件支持很差 - 试图让提交团队为 Java 9+ 修复它。此外,考虑到当前的 Java 发布速度,我们不知道 AspectJ 将得到多长时间的支持。
用 Spoon 可以做到。
这是一个代码片段,它添加一个 System.out.println
和方法的名称作为源代码位于 ./project/src
的 class 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);
如果您可以针对已编译的字节码,您也可以考虑使用 Javassist。请参阅此处的示例 https://www.javassist.org/tutorial/tutorial.html
以下是 Spoon 和 Javassist 的一些示例,可能对您有所帮助https://github.com/Software-Testing/code-manipulation
考虑向您的代码添加跟踪的常见问题。假设 AspectJ 或 Spring AOP 方法不是您想要做的事情 - 除了简单地手动添加跟踪之外,还有哪些其他方法是可能的?
据说 Spoon 或 JavaParser 是替代品,欢迎提供任何示例。
尝试过 AspectJ,它工作得很好,但是它的 Maven 插件支持很差 - 试图让提交团队为 Java 9+ 修复它。此外,考虑到当前的 Java 发布速度,我们不知道 AspectJ 将得到多长时间的支持。
用 Spoon 可以做到。
这是一个代码片段,它添加一个 System.out.println
和方法的名称作为源代码位于 ./project/src
的 class 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);
如果您可以针对已编译的字节码,您也可以考虑使用 Javassist。请参阅此处的示例 https://www.javassist.org/tutorial/tutorial.html
以下是 Spoon 和 Javassist 的一些示例,可能对您有所帮助https://github.com/Software-Testing/code-manipulation