java - Java 8 Compiler Plugin:如何在构造函数中添加 super() 调用?
问题描述
我正在编写一个 Java 编译器插件来添加一个MyClass
在我的项目的某些类中命名的简单类(就像 lombok 一样)。我已经设法通过编写下面的代码来做到这一点(你可以在这里找到整体代码):
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
}
}
任何帮助表示赞赏。
解决方案
该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
);
推荐阅读
- google-analytics - 谷歌标签管理器在单页应用程序中重新创建相同的标签
- c++ - c++ 主题名称到字符串向量的映射
- read-eval-print-loop - Chez计划的先前结果
- php - Laravel Auth 注册路径或登录路径未找到
- bash - How do I compare time in bash?
- dictionary - 使用范围时,GO 是否总是以相同的顺序迭代映射条目?
- c - 如何将非 ascii 从标准输入正确写入文件
- xamarin - ItemsSource 绑定到视图模型中的 ObservableCollection 的自定义控件在删除/添加时不更新
- c++ - 为什么我不能将绑定的成员函数作为可调用对象传递?
- android - react-native-fbsdk 0.8.0 包 com.facebook.reactnative.androidsdk 不存在