в котлине как узнать размер объекта - PullRequest
0 голосов
/ 17 апреля 2019

Возможно ли получить потребление памяти объектом, как в c ++ с помощью sizeOf ()?

для объекта является Parcelable, кажется, что этот мог бы получить необработанные байты, не уверенный, если он точен для размераэтого предмета:

fun marshall(parceable: Parcelable): ByteArray {
    val parcel = Parcel.obtain()
    parceable.writeToParcel(parcel, 0)
    val bytes = parcel.marshall()
    parcel.recycle()
    return bytes
} 

Любое предложение?

Обновление:

Спасибо @Gustavo Passini пинты на ссылку с большим количеством подходов.Кто-то нуждается в пакете java.lang.instrument и не может использовать его на Android, но нашел его, но нуждается в API-уровне выше 26, преобразовал его в колтин и скопировал его сюда как ref ( спасибо Agnius Vasiliauskas ), это верно??:

import java.io.ByteArrayOutputStream
    import java.io.ObjectOutputStream
    import java.io.Serializable

    @TargetApi (26)
    object ObjectSizeCalculator {
        private fun getFirstObjectReference(o: Any): Any? {
            val objectType = o.javaClass.typeName

            if (objectType.substring(objectType.length - 2) == "[]") {
                try {
                    return if (objectType == "java.lang.Object[]")
                        (o as Array<Any>)[0]
                    else if (objectType == "int[]")
                        (o as IntArray)[0]
                    else
                        throw RuntimeException("Not Implemented !")
                } catch (e: IndexOutOfBoundsException) {
                    return null
                }

            }

            return o
        }

        fun getObjectSizeInBytes(o: Any?): Int {
            val STRING_JAVA_TYPE_NAME = "java.lang.String"

            if (o == null)
                return 0

            val objectType = o.javaClass.typeName
            val isArray = objectType.substring(objectType.length - 2) == "[]"

            val objRef = getFirstObjectReference(o)
            if (objRef != null && objRef !is Serializable)
                throw RuntimeException("Object must be serializable for measuring it's memory footprint using this method !")

            try {
                val baos = ByteArrayOutputStream()
                val oos = ObjectOutputStream(baos)
                oos.writeObject(o)
                oos.close()
                val bytes = baos.toByteArray()

                var i = bytes.size - 1
                var j = 0
                while (i != 0) {
                    if (objectType !== STRING_JAVA_TYPE_NAME) {
                        if (bytes[i].toInt() == 112)
                            return if (isArray)
                                j - 4
                            else
                                j
                    } else {
                        if (bytes[i].toInt() == 0)
                            return j - 1
                    }
                    i--
                    j++
                }
            } catch (e: Exception) {
                return -1
            }

            return -1
        }

    }
...