Генерация вызова метода с переменным числом аргументов - PullRequest
0 голосов
/ 10 января 2019

Я использую 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 голосов
/ 08 июля 2019

Чтобы не смешивать интерполяцию 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, который будет заменен литералом (в данном случае это собранный список параметров).

...