JavaPeot筆記

JavaPoet是提供于自動生成java文件的構建工具類框架,使用該框架可以方便根據我們所注解的內容在編譯時進行代碼構建。
以下為該框架項目地址
https://github.com/square/javapoet

說明 備注
MethodSpec 方法構造
TypeSpec 類、接口、枚舉構造
FieldSpec 成員變量、字段構造
JavaFile 頂級Java文件
ParameterSpec 參數構造
AnnotationSpec 注解構造

例子

MethodSpec main = MethodSpec.methodBuilder("main")
    .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
    .returns(void.class)
    .addParameter(String[].class, "args")
    .addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
    .build();

TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
    .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
    .addMethod(main)
    .build();

JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld)
    .build();

javaFile.writeTo(System.out);

MethodSpec

方法 說明 備注
returns 返回值
addStatement 添加語句
beginControlFlow 控制語句(if、while、for)
endControlFlow 結束控制語句

addStatement占位符

占位符 作用 備注
$L 萬用占位符
$S 字符串占位符
$T 內置類型映射支持,會自動 import 聲明 可以更方便的結合ClassName使用
$N 當引用一個通過名字生成的聲明時,可以用當前這個占位符進行占位

$T結合ClassName的使用

在什么對象時可以通過ClassName進行聲明

ClassName hoverboard = ClassName.get("com.mattel", "Hoverboard");
ClassName list = ClassName.get("java.util", "List");
ClassName arrayList = ClassName.get("java.util", "ArrayList");
TypeName listOfHoverboards = ParameterizedTypeName.get(list, hoverboard);

MethodSpec beyond = MethodSpec.methodBuilder("beyond")
    .returns(listOfHoverboards)
    .addStatement("$T result = new $T<>()", listOfHoverboards, arrayList)
    .addStatement("result.add(new $T())", hoverboard)
    .addStatement("result.add(new $T())", hoverboard)
    .addStatement("result.add(new $T())", hoverboard)
    .addStatement("return result")
    .build();

占位符順序替換

CodeBlock.builder().add("I ate $2L $1L", "tacos", 3)

通過在占位符前添加對應占位符位置改變填充值的位置

指定標簽替換

占位符支持指定標簽Key后用Map替換對應的值

Map<String, Object> map = new LinkedHashMap<>();
map.put("food", "tacos");
map.put("count", 3);
CodeBlock.builder().addNamed("I ate $count:L $food:L", map)

控制流(if、while、for)

一般情況下我們可以這樣添加控制語句:

MethodSpec main = MethodSpec.methodBuilder("main")
    .addCode(""
        + "int total = 0;\n"
        + "for (int i = 0; i < 10; i++) {\n"
        + "  total += i;\n"
        + "}\n")
    .build();

生成如下代碼

void main() {
  int total = 0;
  for (int i = 0; i < 10; i++) {
    total += i;
  }
}

MethodSpec提供beginControlFlow和endControlFlow控制流程事務。

MethodSpec main = MethodSpec.methodBuilder("main")
    .addStatement("int total = 0")
    .beginControlFlow("for (int i = 0; i < 10; i++)")
    .addStatement("total += i")
    .endControlFlow()
    .build();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容