Проблема при использовании рефлекса kotlin для сопоставления свойств элемента объекта с hashmap - PullRequest
0 голосов
/ 03 апреля 2019
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
    }


  }

Я написал выше функцию для сопоставления memberProperties object instance его дочернего класса с 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 Ответ

1 голос
/ 03 апреля 2019

ProductInformation::class.memberProperties возвращает коллекцию ProductInformation свойств члена класса.

className::class.memberProperties (где className = this.javaClass.kotlin) возвращает коллекцию свойств члена класса className, что составляет KClass<out Test>,Короче говоря, вы получаете членов KClass вместо Test.

Решение: измените className::class.memberProperties на className.memberProperties.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...