[英]Implementing generated interface with JavaPoet
我想使用JavaPoet來生成一個接口和一個實現這個接口的類。
TypeSpec if = TypeSpec.interfaceBuilder("MyInterface")
.build();
TypeSpec cl = TypeSpec.classBuilder("MyClass")
.build();
但我很難告訴 JavaPoet MyClass
應該實現MyInterface
。 方法addSuperinterface(TypeName)
需要一個類型名稱,我沒有找到如何將TypeSpec
轉換為TypeName
。 我發現的唯一方法是調用ClassName#get(String, String)
。
有沒有更好的方法來實現這一點並直接使用接口的類型規范?
它並不像看起來那么復雜。 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擴展了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 和 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)
,可以獲得以下結果:
class MyClass implements MyInterface { }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.