【问题标题】:Generate a call to a method with a variable number of arguments使用可变数量的参数生成对方法的调用
【发布时间】:2019-06-05 08:12:29
【问题描述】:

我正在使用 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 来构建具有内置模板支持的参数列表。

【问题讨论】:

    标签: java scala code-generation javapoet


    【解决方案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 占位符,该占位符将替换为文字(在本例中为参数的组装列表)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多