Parcelize: Add an intrinsic to access Parcelable CREATOR fields
Fixes KT-19853. The CREATOR field is a static field on a Parcelable class which is not visible from Kotlin since the necessary metadata would have to be in a Companion object which may not exist. This commit adds a [parcelableCreator] function to kotlinx.parcelize, which is optimized to a direct field access whenever possible.
This commit is contained in:
committed by
Alexander Udalov
parent
897c09bf8d
commit
fc013c6b9f
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:Suppress("unused")
|
||||
package kotlinx.parcelize
|
||||
|
||||
import android.os.Parcelable
|
||||
|
||||
/**
|
||||
* Read the CREATOR field of the given [Parcelable] class. Calls to this function with
|
||||
* a concrete class will be optimized to a direct field access.
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
inline fun <reified T : Parcelable> parcelableCreator(): Parcelable.Creator<T> =
|
||||
T::class.java.getDeclaredField("CREATOR").get(null) as? Parcelable.Creator<T>
|
||||
?: throw IllegalArgumentException("Could not access CREATOR field in class ${T::class.simpleName}")
|
||||
Reference in New Issue
Block a user