用JavaPoet实现生成的接口

问题描述 投票:1回答:1

我想使用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个回答
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

作为样板代码(获取器和设置器...)这是一个相应的测试(用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 {}
© www.soinside.com 2019 - 2024. All rights reserved.