我想使用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
它并不像看起来那样复杂。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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。