javapoet-android#View on GitHub
JavaPoet generate Android common codes
Source code
@PoetCode
public class Person {
private String name;
private int age;
}
Generate Parcelable
- implements Parcelable
ClassName parcelableType = ClassName.get("android.os", "Parcelable");
ClassName parcelType = ClassName.get("android.os", "Parcel");
ClassName parcelableCreator = ClassName.get("android.os", "Parcelable", "Creator");
TypeName creatorFieldType = ParameterizedTypeName.get(parcelableCreator, typeName);
typeSpecBuilder.addSuperinterface(parcelableType);
--------------------------------------------------------------------------------
public class PersonParcelable implements Parcelable {}
- construct()
public static MethodSpec createConstructMethod(Modifier... modifiers) {
MethodSpec.Builder method = MethodSpec.constructorBuilder()
.addModifiers(modifiers);
}
--------------------------------------------------------------------------------
public PersonParcelable() {
}
- construct(Parcel)
MethodSpec.Builder method2 = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PUBLIC)
.addParameter(parcelType, "in")
.addStatement("$T classLoader = this.getClass().getClassLoader()", ClassLoader.class);
for (String field : fieldMap.keySet()) {
method2.addStatement("this.$L = ($T)in.readValue(classLoader)", field, fieldMap.get(field));
}
--------------------------------------------------------------------------------
public PersonParcelable(Parcel in) {
ClassLoader classLoader = this.getClass().getClassLoader();
this.name = (String) in.readValue(classLoader);
}
- describeContents()
MethodSpec.Builder method = MethodSpec.methodBuilder("describeContents")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(int.class)
.addStatement("return 0");
--------------------------------------------------------------------------------
@Override
public int describeContents() {
return 0;
}
- writeToParcel(Parcel dest, int flags)
MethodSpec.Builder method1 = MethodSpec.methodBuilder("writeToParcel")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addParameter(parcelType, "dest")
.addParameter(int.class, "flags");
for (String field : fieldMap.keySet()) {
method1.addStatement("dest.writeValue($L)", "this." + field);
}
--------------------------------------------------------------------------------
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(this.name);
}
- CREATOR
ArrayTypeName newTypeArray = ArrayTypeName.of(typeName);
TypeSpec parcelableCreatorType = TypeSpec.anonymousClassBuilder("")
.addSuperinterface(creatorFieldType)
.addMethod(MethodSpec.methodBuilder("createFromParcel")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(parcelType, "source")
.returns(typeName)
.addStatement("return new $T($N)", typeName, "source")
.build())
.addMethod(MethodSpec.methodBuilder("newArray")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(int.class, "size")
.returns(newTypeArray)
.addStatement("return new $T[$N]", typeName, "size")
.build())
.build();
FieldSpec.Builder creatorField = FieldSpec.builder(creatorFieldType, "CREATOR")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer("$L", parcelableCreatorType);
--------------------------------------------------------------------------------
public static final Parcelable.Creator<PersonParcelable> CREATOR = new Parcelable.Creator<PersonParcelable>() {
@Override
public PersonParcelable createFromParcel(Parcel source) {
return new PersonParcelable(source);
}
@Override
public PersonParcelable[] newArray(int size) {
return new PersonParcelable[size];
}
};