使用Kotlin反思将对象成员属性映射到hashmap时出现问题

时间:2019-04-03 05:10:51

标签: java kotlin reflection

open class Test {

    fun getAsHashMap() : HashMap<String, Any> {
        val hashMap = HashMap<String, Any>()
        val className = this.javaClass.kotlin

        for (prop in className::class.memberProperties) {
            val field = className::class.java.getDeclaredField(prop.name)
            val fieldSerializedName : SerializedName? = field.getAnnotation(SerializedName::class.java)
            fieldSerializedName?.let {
                hashMap[fieldSerializedName.value] = prop.get(this)!!
            } ?: run {
                hashMap[prop.name] = prop.get(this)!!
            }
        }

        return hashMap
    }


  }

我已经编写了上述函数,以将其子类的object instance的memberProperties映射到hashmap。它使用成员的序列化名称或属性名称[基于该属性的序列化名称的可用性] 但不幸的是,我收到以下错误。 Error 这是我第一次使用反射java / kotlin,请让我知道它是否可以修复。

编辑1:

如果我像这样直接使用this.javaClass.kotlin的名称,它将非常完美

data class ProductInformation (
        @field:SerializedName("productid")
        val productId: Int,
        @field:SerializedName("productname")
        val productName: String,
        @field:SerializedName("brandname")
        val brandName: String,
        @field:SerializedName("originalprice")
        val originalPrice: Int,
        @field:SerializedName("sellingprice")
        val sellingPrice: Int,
        @field:SerializedName("productgender")
        val productGender: String,
        @field:SerializedName("productvariant")
        val productVariant: String,
        @field:SerializedName("discounted")
        val discounted: String,
        @field:SerializedName("productcategory")
        val productCategory: String
) : StructuredEventAttribute {

    override fun getAsHashMap(): HashMap<String, Any> {
        val hashMap = HashMap<String, Any>()

        for (prop in ProductInformation::class.memberProperties) {
            val field = ProductInformation::class.java.getDeclaredField(prop.name)
            val fieldSerializedName : SerializedName? = field.getAnnotation(SerializedName::class.java)
            fieldSerializedName?.let {
                hashMap[fieldSerializedName.value] = prop.get(this)!!
            } ?: run {
                hashMap[prop.name] = prop.get(this)!!
            }
        }

        return hashMap
    }

}

interface StructuredEventAttribute {
    fun getAsHashMap() : HashMap<String, Any>
}

效果很好

1 个答案:

答案 0 :(得分:1)

ProductInformation::class.memberProperties返回ProductInformation类成员属性的集合。

className::class.memberProperties(其中className = this.javaClass.kotlin)返回className类(即KClass<out Test>)的成员属性的集合。简而言之,您获得的是KClass而不是Test的成员。

解决方案:将className::class.memberProperties更改为className.memberProperties