我使用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"};
如何将数组分配给上一行中的语句?
答案 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();