用JavaPoet实现生成的接口-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

用JavaPoet实现生成的接口

montos 2020-03-27 10:21:24 193

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

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

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

但是我努力告诉JavaPoet MyClass应该实现MyInterface。该方法addSuperinterface(TypeName)需要一个类型名称,但我没有发现如何将a TypeSpec转换为TypeName。我发现的唯一方法是打电话ClassName#get(String, String)。

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

问题来源:Stack Overflow

用java生成 用java接口 生成接口
分享到
取消 提交回答
全部回答(1)
  • montos
    2020-03-27 10:22:13

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

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

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

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

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

    因此,由于您没有在接口规范中指定任何包名称,因此我们可以将其与空字符串一起用作包名称。这将起作用,因为ClassName 扩展了 TypeName。另一方面,我们可以使用类型规范的name属性获取接口的简单名称。

    这里是一个完整的示例实现。我修改了变量的名称(如果变量名称用于接口规范,则该名称将不起作用,因为它是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和setters ...)。这是一个相应的测试(用assertj编写的断言):

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

    或者通过简单地执行a System.out.println(ps.classSpec),可以获得以下结果:

    类MyClass实现MyInterface { }

    回答来源:Stack Overflow

    0 0
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

最新问题