类名 | 作用 |
---|---|
TypeSpec | 用于生成类、接口、枚举对象的类 |
MethodSpec | 用于生成方法对象的类 |
ParameterSpec | 用于生成参数对象的类 |
AnnotationSpec | 用于生成注解对象的类 |
FieldSpec | 用于配置生成成员变量的类 |
ClassName | 通过包名和类名生成的对象,在JavaPoet中相当于为其指定Class |
ParameterizedTypeName | 通过MainClass和IncludeClass生成包含泛型的Class |
JavaFile | 控制生成的Java文件的输出的类 |
addModifiers(Modifier... modifiers)
Modifier是一个枚举对象,枚举值为修饰关键字Public、Protected、Private、Static、Final等等。 所有在JavaPoet创建的对象都必须设置修饰符(包括方法、类、接口、枚举、参数、变量)。
addAnnotation(AnnotationSpec annotationSpec)
addAnnotation(ClassName annotation)
addAnnotation(Class<?> annotation)
该方法即为类或方法或参数设置注解。
addJavadoc(CodeBlock block)
addJavadoc(String format, Object... args)
在编写类、方法、成员变量时,可以通过addJavadoc来设置注释,可以直接传入String对象,或者传入CodeBlock(代码块)。
在JavaPoet中生成类、接口、枚举,必须得通过TypeSpec生成,而classBuilder、interfaceBuilder、enumBuilder便是创建其关键的方法:
创建类:
TypeSpec.classBuilder("类名“)
TypeSpec.classBuilder(ClassName className)
创建接口:
TypeSpec.interfaceBuilder("接口名称")
TypeSpec.interfaceBuilder(ClassName className)
创建枚举:
TypeSpec.enumBuilder("枚举名称")
TypeSpec.enumBuilder(ClassName className)
继承类:
.superclass(ClassName className)
实现接口
.addSuperinterface(ClassName className)
ParameterizedTypeName get(ClassName rawType, TypeName... typeArguments)
addMethod(MethodSpec methodSpec)
通过配置MethodSpec对象,使用addMethod方法将其添加进TypeSpec中。
addEnumConstan(String enumValue)
通过addEnumConstan方法添加枚举值,参数为枚举值名称。
builder(TypeName type, String name, Modifier... modifiers)
通过FieldSpec的build方法生成,传入TypeName(Class)、name(名称)、Modifier(修饰符),就可以生成一个基本的成员变量。通过addField增加即可。
initializer(String format, Object... args)
例如:
public Activity mActivity = new Activity;
实现方法:
ClassName activity = ClassName.get("android.app", "Activity");
FieldSpec spec = FieldSpec.builder(activity, "mActivity")
.addModifiers(Modifier.PUBLIC)
.initializer("new $T", activity)
.build();
MethodSpec.constructorBuilder()
MethodSpec.constructorBuilder()
addParameter(ParameterSpec parameterSpec)
returns(TypeName returnType)
.addException(TypeName name)
addCode()
addStatement()
addStatement()方法时,你只需要专注于该段代码的内容,至于结尾的分号和换行它都会帮你做好。 而addCode()添加的方法体内容就是一段无格式的代码片,需要开发者自己添加其格式。
addParameter(ParameterSpec parameterSpec)
ParameterSpec.builder(TypeName type, String name, Modifier... modifiers)
$T 在JavaPoet代指的是TypeName,该模板主要将Class抽象出来,用传入的TypeName指向的Class来代替。
例如:
Bundle bundle = new Bundle();
ClassName bundle = ClassName.get("android.os", "Bundle");
addStatement("$T bundle = new $T()",bundle)
$N在JavaPoet中代指的是一个名称,例如调用的方法名称,变量名称,这一类存在意思的名称。
例如:
data.toString();
addStatement("data.$N()",toString)
$S在JavaPoet中就和String.format中%s一样,字符串的模板,将指定的字符串替换到$S的地方,需要注意的是替换后的内容,默认自带了双引号,如果不需要双引号包裹,需要使用$L.
例如:
return name
.addStatement("return $S", “name”)
AnnotationSpec.builder(ClassName type)
addMember(String name, String format, Object... args)
使用addMember可以设置注解的属性值,name对应的就是属性名称,format的内容即属性体,同样方法体的格式化在这里也是适用的。
JavaFile.builder(String packageName, TypeSpec typeSpec)
JavaFile通过向build方法传入PackageName(Java文件的包名)、TypeSpec(生成的内容)生成。
javaFile.writeTo(System.out)
生成的内容会输出到控制台中
javaFile.writeTo(File file)
生成的内容会以java文件的方式,存放到你传入File文件的位置