【问题标题】:Implementing generated interface with JavaPoet使用 JavaPoet 实现生成的接口
【发布时间】:2020-06-25 12:37:15
【问题描述】:

我想用JavaPoet生成一个接口和一个实现这个接口的类。

TypeSpec if = TypeSpec.interfaceBuilder("MyInterface")
                      .build();

TypeSpec cl = TypeSpec.classBuilder("MyClass")
                      .build();

但我正在努力告诉 JavaPoet MyClass 应该实现 MyInterface。方法addSuperinterface(TypeName) 需要一个类型名称,我没有找到如何将TypeSpec 变成TypeName。我找到的唯一方法是致电ClassName#get(String, String)

有没有更好的方法来实现这一点并直接使用接口的类型规范?

【问题讨论】:

    标签: java code-generation javapoet


    【解决方案1】:

    它并不像看起来那么复杂。 TypeSpec.Builder 有两个版本的 addSuperInterface 方法:

    TypeSpec.Builder    addSuperinterface(Type superinterface) 
    TypeSpec.Builder    addSuperinterface(TypeName superinterface)
    

    我们可以以第二个版本为例,使用ClassName.get获取超级接口作为TypeName类的实例

    ClassName 类的 get 方法的签名之一是:

    public static ClassName get(String packageName, String simpleName, String... simpleNames)
    

    所以我们可以使用空字符串作为包名,因为您没有在接口规范中指定任何包名。它将起作用,因为 ClassName extends TypeName。 另一方面,我们可以使用类型规范的 name 属性来获取接口的简单名称。

    这里是一个完整的示例实现。我修改了变量的名称(您用于接口规范的变量名称 if 将不起作用,因为它是 java 关键字)。

    @Data
    public class SimpleClassSpecs {
    
        public final TypeSpec interfaceSpec;
        public final TypeSpec classSpec;
    
        public SimpleClassSpecs() {
            interfaceSpec = TypeSpec.interfaceBuilder("MyInterface")
                    .build();
    
            TypeName interfaceTypeName = ClassName.get("", interfaceSpec.name);
            classSpec = TypeSpec.classBuilder("MyClass")
                    .addSuperinterface(interfaceTypeName)
                    .build();
        }
    }
    

    我使用 Lombok 的 @Data 作为样板代码(getter 和 setter...) 下面是一个对应的测试(用assertj写的断言):

    @Test
    public void should_generate_spec_with_superInterface() {
       SimpleClassSpecs ps = new SimpleClassSpecs();
       assertThat(ps.classSpec.toString()).contains("class MyClass implements MyInterface");
    }
    

    或者简单地做一个System.out.println(ps.classSpec),可以得到如下结果:

    类 MyClass 实现 MyInterface { }

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多