javapoet-android generate parcelable

javapoet-android#View on GitHub

JavaPoet generate Android common codes

Source code

@PoetCode
public class Person {
    private String name;
    private int age;
}

Generate Parcelable

  1. 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 {}
  1. construct()
    public static MethodSpec createConstructMethod(Modifier... modifiers) {
        MethodSpec.Builder method = MethodSpec.constructorBuilder()
                .addModifiers(modifiers);
    }
    --------------------------------------------------------------------------------
    public PersonParcelable() {
    }
  1. 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);
    }
  1. 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;
    } 
  1. 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);
    }
  1. 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];
        }
    };

猜你喜欢

转载自blog.csdn.net/wcs542882916/article/details/82959674