java - 如何在 Java AST 中返回泛型类型
问题描述
我正在编写一个程序来修改 Java 抽象语法树 (AST),但我不知道如何生成通用返回类型。谁能帮我?
生成的方法如下所示:
public static List<String> converter() {
return new ArrayList<String>();
}
我正在使用 com.sun.tools.javac.tree.TreeMaker.MethodDef() 来生成方法的 JCTree,如下所示:
return treeMaker.MethodDef(
modifiers,
method,
returnType,
List.nil(),
List.nil(),
List.nil(),
methodBody,
null
);
一切都很好,但问题是“returnType”参数
它是一个 JCExpression 类型,我只能设置为“java.util.List”。
我该如何设置它List<String>
?
似乎没有人回答我。我应该怎么办?
解决方案
用. returnType
_TreeMaker.TypeApply(JCExpression, List<JCExpression>)
例如:
JCTree.JCMethodDecl method = treeMaker.MethodDef(
treeMaker.Modifiers(Flags.PUBLIC | Flags.STATIC),
names.fromString("getStrings"),
treeMaker.TypeApply(
treeMaker.QualIdent((Symbol) elements.getTypeElement("java.util.List")),
List.of(treeMaker.QualIdent((Symbol) elements.getTypeElement("java.lang.String")))
),
List.nil(),
List.nil(),
List.nil(),
treeMaker.Block(
0,
List.of(treeMaker.Return(
treeMaker.NewClass(
null,
List.nil(),
treeMaker.TypeApply(
treeMaker.QualIdent((Symbol) elements.getTypeElement("java.util.List")),
List.of(treeMaker.QualIdent((Symbol) elements.getTypeElement("java.lang.String")))
),
List.nil(),
null
)
))
),
null
);
会产生这样的东西:
public static java.util.List<java.lang.String> getStrings() {
return new java.util.List<java.lang.String>();
}
推荐阅读
- javascript - 阻止来源为“myMainPage.com”的框架访问跨域框架
- python - 更改 pyinstaller 可执行文件的 Stanza 模型目录
- javascript - 在 Leaflet 网页上发出 WMS 请求时定义 TileSize
- bash - 使用 bash 脚本中的循环解压缩目录中的所有文件
- c++ - Clang 格式错误的枚举大括号并忽略设置
- angular - Angular 2 - scrollPositionRestoration:“启用”不适用于每个组件
- c++ - 为什么删除和清除所有对象后内存没有返回系统?
- url - 通过提供用户名/密码与 Prometheus 进行 URL 检查
- c++ - 在变体向量上使用过滤器
- oracle - DBeaver:使用 SQL*Plus 从脚本中获取动态路径