【问题标题】:Assign an Array to a MethodSpec Statement in JavaPoet?将数组分配给 JavaPoet 中的 MethodSpec 语句?
【发布时间】:2020-08-31 22:56:33
【问题描述】:

我使用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"};

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

【问题讨论】:

    标签: java javapoet


    【解决方案1】:

    您不能使用MethodSpec 来实现字符串数组初始化行,afaik。您需要一个简单的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());
      }
    

    【讨论】:

      【解决方案2】:

      不确定是否延迟。但我注意到“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();
      

      【讨论】:

        猜你喜欢
        • 2021-04-17
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2017-01-07
        相关资源
        最近更新 更多