我正在编写一个Java编译器插件,以在我的项目的某些类中添加一个名为MyClass
的简单类(类似于lombok)。我已经成功地通过编写下面的代码来做到这一点(您可以发现整体代码是 here ):
TreeMaker maker = TreeMaker.instance(context);
Names symbolsTable = Names.instance(context);
JCTree.JCClassDecl myClass = maker
.at(((JCTree) node).pos)
.ClassDef(maker.Modifiers(Flags.PUBLIC | Flags.STATIC | Flags.FINAL),
symbolsTable.fromString("MyClass"),
List.nil(),
null, // replace Here by ?
List.nil(),
List.nil()
);
((JCTree.JCClassDecl) node).defs = ((JCTree.JCClassDecl) node).defs.append(myClass);
之前的代码将生成:
public static class MyClass {
}
现在,我想要 MyClass
扩展另一个参数化类:
public static class MyClass extends AnotherClass<Param1, Param2>{
}
我不知道该怎么做!
我所知道的就是将 ClassDef
方法的第四个参数从 null
更改为 JCExpression
。
感谢任何帮助。
最佳答案
扩展表达式:
JCTree.JCIdent extendClassName = maker.Ident(symbolsTable.fromString("AnotherClass"));
ListBuffer<JCTree.JCExpression> extendsParams = new ListBuffer<>();
extendsParams.add(maker.Ident(symbolsTable.fromString("Param1")));
extendsParams.add(maker.Ident(symbolsTable.fromString("Param2")));
JCTree.JCTypeApply extend = maker.TypeApply(extendClassName, extendsParams.toList());
我找到的最好的文档是 lombok项目
关于Java 8编译器插件: How to add extending expression to a generated class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61291064/