Отражение DelegatedProperty не работает при сборке релиза - PullRequest
0 голосов
/ 07 ноября 2019

Во время выполнения мне нужно получить доступ к свойствам в экземпляре делегата делегированного свойства.

Когда я компилирую следующий код в отладке, он работает просто отлично:

class Potato {
    val somePropGoesHere: Int by PotatoDeletgate("This is the key", 0)

    fun getKey(property: KProperty1<Potato, *>): String {
        property.isAccessible = true
        val delegate = property.getDelegate(this)

        return when (delegate) {
            is PotatoDeletgate<*> -> delegate.key
            else -> throw IllegalStateException("Can't observe the property - ${property.name}")
        }
    }

    class PotatoDeletgate<T>(val key: String,
                             defaultValue: T) {
        private var innerValue = defaultValue

        operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
            // more logic
            return innerValue
        }

        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            // more logic
            innerValue = value
        }
    }
}

class PotatoShredder {
    fun doStuff() {
        val potato = Potato()
        val key = potato.getKey(Potato::somePropGoesHere)
    }
}

Когда явызовите метод "doStuff" в отладке, val "key" получит строку "This is the key".

Однако, когда я скомпилирую этот код в релизе, я получу ошибку:

2019-11-07 16: 16: 04.141 7496-7496 /? E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.trax.retailexecution, PID: 7496

eaaaj0: Свойство 'somePropGoesHere' (подпись JVM: getSomePropGoesHere () I) не разрешена в классе com.traxtionile. util.Potato

в eaaapc (KDeclarationContainerImpl.kt: 40)

в eaaaz $ d.invoke (KPropertyImpl.kt: 4)

в eaaal0.a (ReflectProperties. Java: 4)

в eaaaze (KPropertyImpl.kt: 2)

Я не знаю, как

в eaaaz $ e.invoke (KPropertyImpl.kt: 1)

в eaaam0.a (ReflectProperties.java:3)

в eaaazi (KPropertyImpl.kt: 1)

в cmabaa (DefaultConfigurationFactory.java:82)

в cmabaa (DefaultConfigurationFactory.java:153)

в com.trax.retailexecution.util.Potato.getKey (Potato.kt: 1)

в mynamespacegoeshere.PotatoShredder.doStuff (Potato.kt: 2)

Я думал, что это как-то связано с proguard, так как класс и / или методы, которые мы удаляем во время сжатия /сокращается, но я не могу найти способ правильно решить проблему.

1 Ответ

0 голосов
/ 07 ноября 2019

Это действительно связано с proguard - ваш somePropGoesHere не может быть найден в запутанном коде.

Никакого обходного пути для этого нет, за исключением того, что не используется рефлексия :)1006 * Ура!

...