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();