APT-通过JavaPoet生成Java 文件

2,121 阅读2分钟

项目官网地址 github.com/square/java…

简介

JavaPoet是square提供的一套用于生成.java文件的API,该API可读性强上手快,当项目中需要大量的繁琐重复的代码时,我们可以在编译器使用JavaPoet生成java文件

重要的类

类名 作用
TypeSpec 用于生成类,接口,枚举
MethodSpec 用于生成方法
ParameterSpec 用于生成参数
AnnotationSpec 用于生成注解
FiedSpec 用于生成成员变量
TypeName 通过包名和类名生成信息类,相当于java代码中的Class类
ParameterizedTypeName 用于生成带有泛型的类信息
JavaFile 控制生成java文件

常用的方法

添加修饰关键字

    builder.addModifiers(Modifier... modifier)

添加注解

    builder.addAnnotations(Iterable<AnnotationSpec> annotationSpecs)
    builder.addAnnotation(AnnotationSpec annotationSpec)
    builder.addAnnotation(ClassName annotation)
    builder.addAnnotation(Class<?> annotation)

添加注释

    addJavadoc(CodeBlock block)
    addJavadoc(String format, Object... args)

TypeSpec

创建类,接口,枚举

    //创建类
    TypeSpec.ClassBuilder(String classFullName)
    TypeSpec.ClassBuilder(ClassName className)

    //创建接口
    TypeSpec.InterfaceBuilder(String classFullName)
    TypeSpec.InterfaceBuilder(ClassName className)

    //创建枚举
    TypeSpec.enumBuilder(String classFullName)
    TypeSpec.enumBuilder(ClassName className)
    //添加枚举值
    .addEnumConstant(String name)
    .addEnumConstant(String name, TypeSpec typeSpec)
    
    //创建内部类
    TypeSpec.anonymousClassBuilder(CodeBlock typeArguments)
    TypeSpec.anonymousClassBuilder(String typeArgumentsFormat, Object... args)

类的继承与接口实现

    //继承
    .superclass(TypeName typeName)
    .superclass(Type superclass)
    //实现接口
    .addSuperinterfaces(Iterable<? extends TypeName> superinterfaces)
    .addSuperinterface(TypeName superinterface)
    .addSuperinterface(Type superinterface)

AnnotationSpec 生成注解

    AnnotationSpec.builder(ClassName type)
    AnnotationSpec.builder(Class<?> type)
    //设置属性值
    .addMember(String name,String format,Object... args)

FieldSpec变量的创建

    FieldSpec.builder(TypeName type, String name, Modifier... modifiers)

    FieldSpec.builder(Type type, String name, Modifier... modifiers)

MethodSpec生成方法

    //构造方法
    MethodSpec.constructorBuilder()
    //生成方法
    MethodSpec.methodBuilder(String name)
    //添加参数
    .addParameter(ParameterSpec parameterSpec)
    //返回值
    returns(TypeName returnType)
    //方法体
    addCode()
    addStatement()

addCode添加多行代码,需要自己处理;和换行 addStatement添加单行,不需要自己添加;和换行

ParameterSpec生成方法

    //生成参数
    ParameterSpec.builder(TypeName type, String name, Modifier... modifiers)
    ParameterSpec.builder(Type type, String name, Modifier... modifiers)

生成的参数,可以通过methodSpecBuilder.addParameter(ParameterSpec spec)加入方法参数中

TypeName

typeName是简单的表示符、其中包括声明类型(ClassName)、数组(ArrayTypeName)、参数化类型(ParameterizedTypeName)、通配符类型(WildcardTypeName)和类型变量(TypeVariableName)。

分类 生成的类型 写法
className int,File ClassName.get(int.class),ClassName.get("java.io",:"File")
arrayTypeName int[] ArrayTypeName.of(int.class)
ParameterizedType List ParameterizedTypeName.get(List.class, String.class)
TypeVariableName T TypeVariableName.get("T")
WildcardType ? extends String WildcardTypeName.subtypeOf(String.class)

格式化规则

javapoet提供了一套自定义的字符串格式化规则,常用的有L,S,N,T

规则 含义
L 字面值 如整数
S String
N Name 类,接口等
T 变量

项目引入

Download the latest .jar or depend via Maven:

<dependency>
  <groupId>com.squareup</groupId>
  <artifactId>javapoet</artifactId>
  <version>1.11.1</version>
</dependency>

or Gradle:

compile 'com.squareup:javapoet:1.11.1'