使用
详见项目README.md,demo结合代码进行理解
源码
JavaPoet 是一个 Java 代码生成库,可用于创建 Java 源代码。 这是 JavaPoet 库中包含的类列表,下面是简短的描述:
- AnnotationSpec:表示注解的具体信息。
- ArrayTypeName:表示 Java 数组类型的信息。
- ClassName:表示 Java 类名的信息。
- CodeBlock:表示 Java 代码块的信息。
- CodeWriter:提供写入 Java 代码的方法。
- FieldSpec:表示 Java 类的字段的信息。
- JavaFile:表示一个 Java 文件。
- LineWrapper:文本包装类,可自动添加换行符。
- MethodSpec:表示 Java 方法的信息。
- NameAllocator:用于分配唯一的变量名称。
- ParameterizedTypeName:表示泛型类型的信息。
- ParameterSpec:表示一个方法参数的信息。
- TypeName:代表 Java 类型的信息。
- TypeSpec:表示 Java 类或接口的信息。
- TypeVariableName:表示泛型类型变量的信息。
- Util:JavaPoet 库的实用方法集。
- WildcardTypeName:表示通配符类型的信息。
这些类构成了 JavaPoet 的核心,使开发人员能够生成 Java 代码。它们提供了一组方便的 API,使开发人员可以声明和配置 Java 类、方法、字段和注释,并生成相应的 Java 代码。这使得 JavaPoet 成为生产 Java 代码的强大工具。
TypeName及其子类
TypeName 是 com.squareup.javapoet 包中的一个类,用于表示 Java 类型的名称。它是一个抽象类,有一些子类用于表示不同类型的名称。以下是 TypeName 及其子类的分析:
- TypeName(抽象类):TypeName 是一个抽象类,用于表示 Java 类型的名称。它提供了一些公共方法,如 annotated()、withoutAnnotations()、isAnnotated() 等,用于操作类型名称的注解信息。
- ClassName:ClassName 是 TypeName 的子类,用于表示类的名称。它包含了包名、类名、内部类名等信息。ClassName 提供了一些静态工厂方法,如 get()、bestGuess() 等,用于创建 ClassName 对象。它还提供了一些方法,如 packageName()、enclosingClassName()、simpleName() 等,用于获取类名的各个部分。
- ParameterizedTypeName:ParameterizedTypeName 是 TypeName 的子类,用于表示参数化类型的名称,如泛型类或泛型接口。它包含了原始类型和类型参数的信息。ParameterizedTypeName 提供了一些静态工厂方法,如 get(),用于创建 ParameterizedTypeName 对象。
- TypeVariableName:TypeVariableName 是 TypeName 的子类,用于表示类型变量的名称。它包含了类型变量的名称和上限信息。TypeVariableName 提供了一些静态工厂方法,如 get(),用于创建 TypeVariableName 对象。
- WildcardTypeName:WildcardTypeName 是 TypeName 的子类,用于表示通配符类型的名称。<extends?T>或者<super?T>它包含了上界和下界的信息。WildcardTypeName 提供了一些静态工厂方法,如 subtypeOf()、supertypeOf(),用于创建 WildcardTypeName 对象。
这些子类都继承自 TypeName,并提供了特定类型的名称表示。它们可以用于生成 Java 代码,描述类型的名称和结构,以便进行代码生成和分析。通过使用这些子类,我们可以更加灵活和准确地表示和操作 Java 类型的名称。
TypeName及其子类
TypeName 是JavaPoet库中的一个类,用于表示Java类型的名称。它是一个抽象类,其子类包括 ClassName、ParameterizedTypeName、WildcardTypeName、TypeVariableName 和 ArrayTypeName。
下面是各个子类的详细说明:
1. ClassName
ClassName 表示一个普通的类名,由类的包名和类名组成。例如,java.lang.String 的 ClassName 为 ClassName.get("java.lang", "String")。ClassName 还提供了一些常用的静态方法,例如 getPackageName()、getSimpleNames()、nestedClass() 等。
2. ParameterizedTypeName
ParameterizedTypeName 表示一个带有类型参数的泛型类型。例如,List<String> 的 ParameterizedTypeName 可以使用 ParameterizedTypeName.get(List.class, ClassName.get(String.class)) 创建。ParameterizedTypeName 还提供了一些方法来获取其内部的类型和参数类型。
3. WildcardTypeName
WildcardTypeName 表示一个通配符类型,例如 ? 或者 ? extends Number。可以使用 WildcardTypeName.subtypeOf(TypeName) 或者 WildcardTypeName.supertypeOf(TypeName) 获取子类型或父类型的通配符类型。
4. TypeVariableName
TypeVariableName 表示一个类型变量,例如 <T> 中的 T。TypeVariableName 可以使用名称或者名称和边界来创建。例如,TypeVariableName.get("T") 或者 TypeVariableName.get("T", ClassName.get(Number.class))。
5. ArrayTypeName
ArrayTypeName 表示一个数组类型。例如,int[] 的 ArrayTypeName 可以使用 ArrayTypeName.of(int.class) 创建。ArrayTypeName 还提供了一个 .componentType() 方法来获取其元素类型的 TypeName。
总而言之,TypeName 及其子类提供了丰富的方法和属性来表示Java类型并进行操作。例如,您可以使用这些类来构建方法或字段,并用于生成Java代码。
Spec类
在 com.squareup.javapoet 包中,有几个 Spec 类,它们都是用于生成 Java 代码的规范类。以下是其中几个常用的 Spec 类:
- TypeSpec:用于描述一个 Java 类、接口或枚举类型的规范。它包含了类的名称、修饰符、字段、方法、内部类等信息,可以用于生成 Java 代码文件。
- MethodSpec:用于描述一个 Java 方法的规范。它包含了方法的名称、修饰符、返回类型、参数、注解、代码块等信息,可以用于生成方法的代码。
- ParameterSpec:用于描述一个 Java 方法或构造函数的参数的规范。它包含了参数的名称、类型、注解等信息,可以用于生成方法或构造函数的参数列表。
- AnnotationSpec:用于描述一个 Java 注解的规范。它包含了注解的类型、成员变量等信息,可以用于生成注解的代码。
这些 Spec 类都提供了丰富的 API,可以用于生成各种类型的 Java 代码。通过使用这些规范类,我们可以更加方便地生成 Java 代码,避免手动拼接字符串的繁琐过程。
TypeSpec 类的每个成员的含义如下:
-
name:表示类的名称或接口的名称或枚举类型的名称或注解类型的名称。
-
kind:表示类的类型,可以是 CLASS、INTERFACE、ENUM 或 ANNOTATION。
-
modifiers:表示类的修饰符,是一个 Set 类型的集合,用于描述类的访问级别和其他修饰符,如 public、private、abstract 等。
-
superclass:表示类的父类,是一个 TypeName 类型的对象,用于描述类继承关系。
-
superinterfaces:表示类实现的接口,是一个 List 类型的列表,用于描述类实现的接口。
-
enumConstants:表示枚举类型的常量,是一个 List 类型的列表,用于描述枚举类型的常量。
-
fields:表示类的字段,是一个 List 类型的列表,用于描述类的字段。
-
methods:表示类的方法,是一个 List 类型的列表,用于描述类的方法。
-
typeSpecs:表示类的内部类,是一个 List 类型的列表,用于描述类的内部类。
-
annotations:表示类的注解,是一个 List 类型的列表,用于描述类的注解。 以上是 TypeSpec 类的主要成员,它们用于描述一个 Java 类、接口或枚举类型的规范。通过设置这些成员的值,我们可以定义类的名称、类型、修饰符、继承关系、实现接口、字段、方法、内部类和注解等信息。最终,通过构建 TypeSpec 对象,我们可以生成相应的 Java 代码。
AnnotationSpec.java,它是JavaPoet库中的一个类,用于表示生成的注解。 该类的主要功能是生成注解的代码表示。它包含了注解的类型、成员变量以及注解值的生成方法。 以下是该类的主要方法和功能:
- 构造方法:接受注解的类型和成员变量的映射,并将其保存在type和members字段中。
- emit方法:根据给定的CodeWriter对象和是否内联的标志,生成注解的代码表示。根据注解的成员变量数量和类型,生成不同形式的注解代码。
- emitAnnotationValues方法:生成注解值的代码表示。根据注解值的数量和类型,生成不同形式的注解值代码。
- get方法:根据给定的注解对象,生成对应的AnnotationSpec对象。
- builder方法:根据给定的注解类型,创建一个AnnotationSpec.Builder对象。
- toBuilder方法:创建一个新的AnnotationSpec.Builder对象,并将当前AnnotationSpec对象的成员变量复制到新对象中。
- equals方法和hashCode方法:重写了equals和hashCode方法,以便正确比较和哈希AnnotationSpec对象。
- toString方法:生成当前AnnotationSpec对象的字符串表示。
- AnnotationSpec.Builder类:用于构建AnnotationSpec对象的内部类。它包含了添加注解成员变量的方法和构建AnnotationSpec对象的方法。
总结:AnnotationSpec.java是JavaPoet库中用于表示生成的注解的类。它提供了生成注解代码的方法,并且可以从注解对象中获取注解信息并生成对应的AnnotationSpec对象。
javax.lang
建造者模式,组合模式