自定义注解生成代码(三) 之javapoet案例实战
前面两个章节主要介绍了 javapoet 的基础语法和基本使用,感兴趣的同学可以查看博客 自定义注解生成代码(一)之 javaPoetAPI详解 和 自定义注解生成代码(二) 之javapoetAPI使用举例
本章我打算使用更加贴近实战的案例巩固大家对javapoet的认识,废话不多说,直接上代码。
总结:
JavaPoet是square推出的开源java代码生成框架,提供Java Api生成.java源文件。这个框架功能非常有用,我们可以很方便的使用它根据注解、数据库模式、协议格式等来对应生成代码。通过这种自动化生成代码的方式,可以让我们用更加简洁优雅的方式要替代繁琐冗杂的重复工作。
官方源码 :https://github.com/square/javapoet
2.2 关键类说明
类名 | 说明 | 备注 |
---|---|---|
JavaFile | A Java file containing a single top level class | 用于构造输出包含一个顶级类的Java文件 |
TypeSpec | A generated class, interface, or enum declaration | 生成类,接口,或者枚举 |
MethodSpec | A generated constructor or method declaration | 生成构造函数或方法 |
FieldSpec | A generated field declaration | 生成成员变量或字段 |
ParameterSpec | A generated parameter declaration | 用来创建参数 |
AnnotationSpec | A generated annotation on a declaration | 用来创建注解 |
在JavaPoet中,JavaFile是对.java文件的抽象,TypeSpec是类/接口/枚举的抽象,MethodSpec是方法/构造函数的抽象,FieldSpec是成员变量/字段的抽象。这几个类各司其职,但都有共同的特点,提供内部Builder供外部更多更好地进行一些参数的设置以便有层次的扩展性的构造对应的内容。
另外,它提供$L(for Literals), $S(for Strings), $T(for Types), $N(for Names)等标识符,用于占位替换。
官网介绍:https://docs.gradle.org/4.10.1/userguide/java_plugin.html#sec:incremental_annotation_processing
第一步 , 从 maven 仓库,找到相对稳定的版本引用 https://mvnrepository.com/


第二部 ,在项目对用moudle的 build.gradle文件中添加对应引用
implementation 'com.squareup:javapoet:1.11.1'
第三步 , 愉快的开始使用
案例一 使用javapoet生成简单的helloword
-
生成后的代码如下:
package com.example.helloworld; public final class HelloWorld { public static void main(String[] args) { System.out.println("Hello, JavaPoet!"); } }
-
javapoet代码,
生成代码生成一般是由内向外的,先生成里面的主方法然后生成外层的主类 HelloWorld ,最后将主类写入到 HelloWord.java 文件 或 者直接打印到控制台
public static void main(String[] args) {
//使用 MethodSpec 主方法main生成
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 helloWorld = TypeSpec.classBuilder("HelloWorld") //主类的名称
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(main)
.addJavadoc("注释注解代码块")
.build();
try {
JavaFile javaFile = JavaFile.builder("com.zbc.latte_compiler.javapoeatdemo", helloWorld)
.build();
/**
* 代码写入控制台
*/
javaFile.writeTo(System.out);
/**