避免反射的更好方法是像这样在目标类型中简单地调用静态创建者:
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in)
并写入Parcelable
使用this.amazingObject.writeToParcel(Parcel, int)
在内部,readParcelable(ClassLoader)
发生这种情况时:
public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
Parcelable.Creator<T> creator = readParcelableCreator(loader);
if (creator == null) {
return null;
}
if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
}
return creator.createFromParcel(this);
}
如您所见,该方法的最后一次调用只是调用正确的方法,Creator
但是在内部readParcelableCreator
却有很多反射,我们可以通过直接调用它来避免。
该实用程序调用可能有用:
import android.os.Parcel;
import android.os.Parcelable;
public class Parcels {
public static void writeBoolean(Parcel dest, Boolean value) {
dest.writeByte((byte) (value != null && value ? 1 : 0));
}
public static Boolean readBoolean(Parcel in){
return in.readByte() != 0;
}
public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) {
writeBoolean(dest, parcelable == null);
if (parcelable != null) {
parcelable.writeToParcel(dest, flags);
}
}
public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) {
boolean isNull = readBoolean(in);
return isNull ? null : creator.createFromParcel(in);
}
}
A object
里面的B在哪里?