将数组分配给JavaPoet中的MethodSpec语句?

时间:2015-04-28 16:32:23

标签: java 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"};

如何将数组分配给上一行中的语句?

2 个答案:

答案 0 :(得分:4)

您不能使用MethodSpec来获取字符串数组初始化行,afaik。您需要一个简单的CodeBlock并首先将数组转换为源代码文字。

以下是使用Java 8 String.join从Java测试数组中使用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());
  }

答案 1 :(得分:0)

不确定是否延迟。但我注意到“ testArray”似乎是目标类中的一条语句,但在addStatement()中被称为$ N。为了使$ N起作用,它必须是您代码中的FieldSpec。

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

然后

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