リフレクションを回避するためにこれを処理するより良い方法は、次のようにターゲット型で静的クリエーターを単純に呼び出すことです。
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
Parcelable
それをusingに書き込みます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);
}
}