Java 8 编译器插件:如何向生成的 class 添加扩展表达式?
Java 8 compiler Plugin : How to add extending expression to a generated class?
我正在编写一个 Java 编译器插件,以在我的项目的某些 class 中添加一个名为 MyClass
的简单 class(类似于 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
扩展另一个参数化 class :
public static class MyClass extends AnotherClass<Param1, Param2>{
}
我不知道该怎么做!
我所知道的是将 ClassDef
方法的第 4 个参数从 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 编译器插件,以在我的项目的某些 class 中添加一个名为 MyClass
的简单 class(类似于 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
扩展另一个参数化 class :
public static class MyClass extends AnotherClass<Param1, Param2>{
}
我不知道该怎么做!
我所知道的是将 ClassDef
方法的第 4 个参数从 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 项目