Java 8编译器插件:如何在构造函数中添加super()调用?

问题描述 投票:0回答:1

我正在编写Java编译器插件,以在项目的某些类中添加一个名为MyClass的简单类(类似于lombok那样)。我设法通过编写下面的代码来做到这一点(您可以找到整个代码为here):

TreeMaker maker = TreeMaker.instance(context);
Names symbolsTable = Names.instance(context);

//...

JCTree.JCMethodDecl constructor = maker.MethodDef(maker.Modifiers(Flags.PUBLIC),
        symbolsTable.init,
        null,
        List.nil(), // params
        List.nil(),
        List.nil(),
        maker.Block(0, List.of(callSuper)),
        null
);

JCTree.JCClassDecl myClass = maker
        .at(((JCTree) node).pos)
        .ClassDef(maker.Modifiers(Flags.PUBLIC | Flags.STATIC | Flags.FINAL),
                symbolsTable.fromString("MyClass"),
                List.nil(),
                maker.Ident(symbolsTable.fromString("AnotherClass")),
                List.nil(),
                List.of(constructor)
        );

((JCTree.JCClassDecl) node).defs = ((JCTree.JCClassDecl) node).defs.append(myClass);

我不知道如何编写callSuper语句来获取此输出:

public static final MyClass extends AnotherClass {
   public MyClass () {
      super(); // I want this line
   }
}

感谢您的任何帮助。

java code-generation javac java-compiler-api
1个回答
0
投票

callSuper语句的编写如下:

JCTree.JCMethodInvocation superMethod = maker.Apply(List.nil(), maker.Ident(symbolsTable._super), List.nil());
JCTree.JCExpressionStatement callSuper = maker.Exec(superMethod); 

然后在构造函数中使用它:

JCTree.JCMethodDecl constructor = maker.MethodDef(maker.Modifiers(Flags.PUBLIC),
        symbolsTable.init,
        null,
        List.nil(),
        List.nil(),
        List.nil(),
        maker.Block(0, List.of(callSuper)),
        null
);
© www.soinside.com 2019 - 2024. All rights reserved.