概述
因为需要应对对不同的业务,而每一个业务都对应一个数据模型和自己的字段属性,如果为每一个业务设计解析云端数据的代码,必然导致代码量随着业务的扩展快速增加,因此,使用反射来屏蔽差异,就显得尤为重要。
- 首先创建数据类
data class Data(var open:MutableList<String> = mutableListOf(),
var close:MutableList<String> = mutableListOf())
注意:这里数据类必须要赋默认值,否则后面的createInstance()方法会报错。
- 然后,利用反射创建对象并为数据类赋值。
import kotlin.reflect.*
import kotlin.reflect.full.createInstance
import kotlin.reflect.full.declaredMemberProperties
class Test {
companion object {
@JvmStatic
fun main(args:Array<String>) {
val t = Test()
val obj:Data = t.getInstance(Data::class) as Data
print(obj.toString())
// 输出:
//Data(open=[open data], close=[close data])
}
}
fun getInstance(param:KClass<*>):Any{
val pa:MutableList<String> = mutableListOf()
pa.add("open data")
val pua:MutableList<String> = mutableListOf()
pua.add("close data")
val allData:HashMap<String, Any?> = HashMap()
allData["close"] = pua
allData["open"] = pa
// 创建对象
val instance = param.createInstance()
val pro = param.declaredMemberProperties
pro.forEach {
// 设置为可修改类型
val kmp = it as KMutableProperty1<Any, Any?>
kmp.set(instance, allData[it.name])
}
return instance
}
}
- 数据来源本来是云端数据,这里采用常量模拟,代码中再赋值就行。
- 字典的index可以通过反射获取数据类的参数名来获得,因此,只要云端字段和本地的数据模型类的字段设置一致,就可以直接返回数据模型类了,屏蔽了底层的常量解析,对于后期维护和代码量的减少都有很大的帮助。
- 获取类型名
Data::class.java.declaredFields.forEach {
print(it.name) // 参数名
}
最后
以上就是清新雨为你收集整理的Kotlin使用反射创建对象并且为属性赋值的全部内容,希望文章能够帮你解决Kotlin使用反射创建对象并且为属性赋值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复