Назначить массив для инструкции MethodSpec в JavaPoet?

Я использую JavaPoet для создания кода Java. Я определил следующий массив:

String[] testArr = new String[] {"1","2"};

и конструктор:

ArrayTypeName stringArray = ArrayTypeName.of(String.class);

MethodSpec constroctMethod = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PUBLIC)
                    .addStatement("$T names", stringArray)
                    .addStatement("names = $N", testArr)
                    .build();

Бывший не работает. Я хочу создать заявление:

String[] names = new String[] {"1","2"};

Как я могу назначить массив для оператора, как в предыдущей строке?

1 ответ

Вы не можете использовать MethodSpec чтобы получить строку инициализации массива строк, афаик. Вам нужно простое CodeBlock и сначала преобразовать массив в литерал исходного кода.

Вот пример использования Java 8 String.join создать литерал из вашего тестового массива с помощью JavaPoet 1.3 (см. выражения формата на основе индекса).

  @Test
  public void testStringArrayInit() {
    String expected = "java.lang.String[] names = new java.lang.String[] {\"1\",\"2\"}";
    String[] testArr = new String[] { "1", "2" };
    String literal = "{\"" + String.join("\",\"", testArr) + "\"}";
    ArrayTypeName stringArray = ArrayTypeName.of(String.class);
    CodeBlock block = CodeBlock.builder().add("$1T names = new $1T $2L", stringArray, literal).build();
    Assert.assertEquals(expected, block.toString());
  }

Не уверен, задерживается ли это. Но я заметил, что "testArray" выглядит как оператор в целевом классе, но упоминается как $N как часть addStatement(). Чтобы $N работал, это должен быть FieldSpec в вашем коде.

FieldSpec testArray = FieldSpec.Builder(...).build();

а потом

MethodSpec constroctMethod = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PUBLIC)
                    .addStatement("$T names", stringArray)
                    .addStatement("names = $N", testArr)
                    .build();
Другие вопросы по тегам