我尝试使用xtend的活动注释,我想创建一个实时注释,它可以生成一个String[]
字段来记录方法参数的名称。
@Target(ElementType::TYPE)
@Active(typeof(ParameterRecorderProcessor))
annotation ParameterRecorder {
}
class ParameterRecorderProcessor extends AbstractClassProcessor {
override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {
var iii = 0;
// add the public methods to the interface
for (method : annotatedClass.declaredMethods) {
if (method.visibility == Visibility::PUBLIC) {
iii = iii + 1
annotatedClass.addField(method.simpleName + "_" + iii) [
type = typeof(String[]).newTypeReference // String[] doesn't work
var s = ""
for (p : method.parameters) {
if(s.length > 0) s = s + ","
s = s + "\"" + p.simpleName + "\""
}
val ss = s
initializer = [
'''[«ss»]'''
]
]
}
}
}
}
您可以看到我使用typeof(String[]).newTypeReference
来定义新创建字段的类型,但它不起作用。生成的java代码如下所示:
private Object index_1;
它使用Object
,initializer
部分为空。
如何解决?
答案 0 :(得分:1)
对我来说这看起来像个错误。要解决此问题,您可能需要使用typeof(String).newTypeReference.newArrayTypeReference
或更简洁的string.newArrayTypeReference