APT-經過JavaPoet生成Java 文件

項目官網地址 github.com/square/java…java

簡介

JavaPoet是square提供的一套用於生成.java文件的API,該API可讀性強上手快,當項目中須要大量的繁瑣重複的代碼時,咱們能夠在編譯器使用JavaPoet生成java文件git

重要的類

類名 做用
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添加單行,不須要本身添加;和換行github

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)。bash

分類 生成的類型 寫法
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,Tui

規則 含義
L 字面值 如整數
S String
N Name 類,接口等
T 變量

項目引入

Download the latest .jar or depend via Maven:spa

<dependency>
  <groupId>com.squareup</groupId>
  <artifactId>javapoet</artifactId>
  <version>1.11.1</version>
</dependency>
複製代碼

or Gradle:code

compile 'com.squareup:javapoet:1.11.1'
複製代碼
相關文章
相關標籤/搜索