簡體   English   中英

使用 JavaPoet 實現生成的接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM