也许重新考虑勺子?一旦你知道抽象语法树是什么,它就很直观了。您基本上可以导航、过滤和替换 AST 上代表您的代码的节点,直到您获得所需的转换。
如果我们有以下类:
public class Test {
Object method(){
return "bla bla bla";
}
}
您的示例可能的 Spoon 解决方案是:
Launcher spoon = new Launcher();
spoon.addInputResource("./src/main/java/Test.java");
spoon.buildModel();
CtClass ctClass = spoon.getModel().getRootPackage().getType("Test");
CtLiteral match = ctClass.filterChildren((CtLiteral l) -> l.getType().getSimpleName().equals("String") && l.getValue().equals("bla bla bla")).first();
Factory factory = spoon.getFactory();
match.replace(factory.createCodeSnippetExpression("new MyClass(\"bla\", 3)"));
System.out.println(ctClass);
前四行构建输入程序的 Spoon 模型并检索感兴趣的类元素。
接下来要修改的文字使用过滤器检索,该过滤器返回类型为 name"String"
和 value的第一个也是唯一的文字"bla bla bla"
。
最后匹配的文字在 AST 中被替换为所需的代码片段。使用代码构造类将代码片段从字符串自动解析为 Spoon 模型Factory
。
打印类模型时,会给出所需的转换:
public class Test {
java.lang.Object method() {
return new MyClass("bla", 3);
}
}