我对Kotlin和Java有点陌生,有以下问题:如何检查反映的属性类型是否为特定类型的ArrayList,例如ArrayList
背后的代码:
class DataUploadFormData {
var files: ArrayList<Pair<String, ByteArray>> = arrayListOf()
var collection: String? = null
}
// DataUploadFormData type is passed here as T
suspend inline fun <reified T : Any> mapFormData(data: MultiPartData): T? {
val formData: FormData = getFormData(data)
val model: T? = getValue()
var fields = T::class.memberProperties
fields.forEach { field ->
if (field is KMutableProperty<*>) {
setFieldValue(field, formData, model)
}
}
return model
}
@OptIn(ExperimentalStdlibApi::class)
fun <T> setFieldValue(field: KMutableProperty<*>, formData: FormData, model: T?) {
var value: Any? = null
if (field.returnType.javaType == String::class.createType().javaType ||
field.returnType.javaType == Int::class.createType().javaType ||
field.returnType.javaType == Double::class.createType().javaType
) {
value = formData.fields.firstOrNull(predicate = { it.first == field.name })?.second
}
else if (
// check if field.returnType is of ArrayList<Pair<String, ByteArray>> type?
) {
value = formData.files
}
field.setter.call(model, value)
}
检查简单数据类型工作得很好,但不知道如何检查反射属性是否为复杂类型。我试图实例化属性并使用is
或instanceof
,但我无法用field.returnType.javaType::class.createInstance()
这样的代码实例化属性。检查field.returnType.classifier is ArrayList<*>
是否返回false
使用typeOf
获得代表您想要检查的类型的KType
,并使用==
进行比较。
if (field.returnType == typeOf<ArrayList<Pair<String, ByteArray>>>()) {
// ...
}
对于那些"简单类型"可以这样做。。
这只检查声明的属性的返回类型,而不检查该属性是否实际持有ArrayList<Pair<String, ByteArray>>
的实例。因此,如果该字段被声明为:
var field: ArrayList<*> = arrayListOf(
"foo" to byteArrayOf()
)
检查将失败。声明的字段类型是ArrayList<*>
,但可以说它实际上保存的是ArrayList<Pair<String, ByteArray>>
。
由于类型擦除,您无法可靠地检查字段所持有的实例的类型。