fab*_*ian 5 java code-generation netbeans-platform netbeans-8
我想TreeMaker在我的 netbeans 代码生成器插件中使用类型参数生成构造函数调用。此外,我想导入类型而不是使用完全限定的名称(请参阅 参考资料QualIdent)。
我正在为此目的使用该NewClass方法。
给定输入java.util.ArrayList和java.lang.Integer生成的代码应该类似于:
import java.util.ArrayList;
...
new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
如果输入是java.util.ArrayList,java.util.List<java.lang.Integer>并且生成的代码应该类似于:
import java.util.ArrayList;
import java.util.List;
...
new ArrayList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)
(类型参数列表存储为List<? extends TypeMirror>)
如何生成所需的输出?
(maker是TreeMaker实例)
将类型名称转换为字符串:
String className = "java.util.ArrayList<java.util.List<java.lang.Integer>>"; // actually computed in real code
maker.NewClass(null,
Collections.<ExpressionTree>emptyList(),
maker.QualIdent(className),
Collections.<ExpressionTree>emptyList(),
null);
Run Code Online (Sandbox Code Playgroud)
这会产生语法/语义正确的 java 代码,但使用完全限定的类名,即 new java.util.ArrayList<java.util.List<java.lang.Integer>>()
通过typeArguments至NewClass:
List<ExpressionTree> typeArguments = Collections.singletonList(maker.QualIdent("java.lang.Integer")); // actually computed in real code
maker.NewClass(null,
typeArguments,
maker.QualIdent("java.util.ArrayList"),
Collections.<ExpressionTree>emptyList(),
null);
Run Code Online (Sandbox Code Playgroud)
这确实是 import ArrayList,但是类型参数是直接在new关键字后添加的,即new <Integer>ArrayList()生成,这是错误的。
使用 aParameterizedTypeTree作为类型的标识符,这不起作用,因为TreeMaker需要 type 的参数ExpressionTree,但这不是 的超类型ParameterizedTypeTree。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |