kotlin - DelegatedProperty 反射不适用于发布版本
问题描述
在运行时,我需要访问委托属性的委托实例中的属性。
当我在调试中编译以下代码时,它工作得很好:
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”方法时,“key”val 将获得“This is the key”字符串。
但是,当我在发行版中编译此代码时,出现错误:
2019-11-07 16:16:04.141 7496-7496/? E/AndroidRuntime:致命异常:主进程:com.trax.retailexecution,PID:7496
eaaaj0:属性“somePropGoesHere”(JVM 签名:getSomePropGoesHere()I)未在 com.trax.retailexecution.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有关,因为我们在压缩/收缩期间删除了类和/或方法,但我真的找不到正确解决问题的方法。
解决方案
它确实连接到 proguard - 在混淆代码中找不到您的 somePropGoesHere。
除了不使用反射之外,没有任何解决方法:)(我建议这样做)
您还可以将您的 PotatoDelegate 添加到 proguard 规则中:)
干杯!
推荐阅读
- sql - PostgreSQL 中的方程只返回 0
- reactjs - 当我使用reactjs悬停时无法显示图标
- reactjs - react-jsonschema-form 自定义元素位置
- javascript - 使用javascript添加和删除伪元素
- python - 在按键上打开随机视频文件
- java - 没有这样的方法异常,在创建类的新实例时在泛型方法中
- android - 自定义 nativescript-exoplayer 的控制器视图
- java - 无法使用 JDBC 正确查询数据库
- machine-learning - 如何为 NLP 分类器使用多个文本特征?
- swift - 如何在不移动可见文本区域的情况下将 UITextView 文本选择更改为删除线