当在一个公用的对某个对象的某一字段进行数据处理的方法中,能够对不同类型的对象进行取值或赋值,这时候开发者知道该值对应的字段名,但在公用的方法中不可能使用object.字段名进行取值或赋值,这时候就需要使用反射机制。
利用泛型,当外部方法去调用的时候,传入某一字段名称如“Name”,就可以在一个实体中找到名称为“Name”的字段。可以利用这个字段(Field)去获取该实体中该字段对应的值、类型,也可以设置该字段对应的值。一般对象的取值方式是object.name.get()去获取name的值,这里的Field就相当于是object.name的这一部分,但能够做的事情比object.name要多得多。
Get
inline fun <reified T>getFieldValue(it : T , bindField: String): String{
val f = T::class.java.getDeclaredField(bindField)
f.isAccessible = true
return if (f.get(it) != null){
try {
when (f.type.name) {
"java.util.HashMap" -> {
(f.get(it) as HashMap<*, *>).values.joinToString()
}
"java.util.Map" -> {
(f.get(it) as Map<*, *>).values.joinToString()
}
"java.util.Date" -> {
SimpleDateFormat("yyyy-MM-dd").format(f.get(it))
}
"java.util.ArrayList" -> {
(f.get(it) as ArrayList<*>).joinToString()
}
"java.util.Array" -> {
(f.get(it) as Array<*>).joinToString()
}
else -> {
f.get(it)!!.toString()
}
}
}catch (e:Exception){
""
}
}else{
""
}
}
reified 需要与 inline 配套使用, T::class.java.getDeclaredField(string) 需要与 reified 配套使用。
外部调用
val name : String = setTableTitle<EmployeeEntity>(employeeData,"Name")
Set
fun <T>setFieldValue(t : T , bindField : String , value : String){
val f = T::class.java.getDeclaredField(bindField)
f.isAccessible = true
f.set(t , value)
}
外部调用
setFieldValue<EmployeeEntity>(data,"Name","张三")