生成对具有可变数量参数的方法的调用

时间:2019-01-10 12:43:26

标签: java scala code-generation javapoet

我正在使用JavaPoet生成具有给定字段列表的类。

生成一个使用此字段列表并将其转换为参数列表的构造函数非常简单,类似于以下内容:

val constructor = MethodSpec.constructorBuilder()
for ((fieldName, typeName) <- fields) {
  constructor.addParameter(typeName, fieldName)
}

我还想生成一个静态方法,该方法实例化所生成类的新对象,这需要我生成一个使用上述字段列表的代码块。

目前,我正在通过以下方式实现这一目标:

method
  .addStatement(s"return new $$T(${fields.map(_._1).mkString(", ")})", className)

它可以工作,但是我想知道是否有一种更“惯用”的方式来使用JavaPoet并通过内置的模板支持来构建参数列表。

1 个答案:

答案 0 :(得分:1)

为了避免混合使用Scala的插值和JavaPoet的模板,看起来最好的方法是制作一个包含参数列表的CodeBlock并使用模板将其嵌入代码中,如下所示例如:

val params = fields.map { case (name, _) => CodeBlock.of(name) }
val paramList = CodeBlock.join(params.asJava)
method.addStatement("return new $T($L)", className, paramList)

此处的模板使用$L占位符,该占位符将被文字(在这种情况下,是组合的参数列表)替换。