Kotlin反射不可用。

19

我试图从这个视频的第一个例子中学习高阶函数。这是我的代码和输出结果。

代码

fun lowercase(value: String) = value.toLowerCase()

fun higherOrder(value:String, op: (String) -> String) : String {
    println("Executing higher order fun $op")
    return op(value)
}

fun main(args: Array<String>) {
    println(higherOrder("HELLO", ::lowercase))
    println(higherOrder("hello", {it -> lowercase(it)}))
    println(higherOrder("HeLlo", { x -> lowercase(x) }))
    println(higherOrder("Hello", { lowercase(it) }))
}

输出

Executing higher order fun function lowercase (Kotlin reflection is not available)
hello
Executing higher order fun Function1<java.lang.String, java.lang.String>
hello
Executing higher order fun Function1<java.lang.String, java.lang.String>
hello
Executing higher order fun Function1<java.lang.String, java.lang.String>
hello

Process finished with exit code 0
所以我的问题是,为什么它会打印 Kotlin reflection is not available
2个回答

34

要进行完整的反射操作,需要使用 kotlin-reflect 库以及 kotlin-stdlib 库。 如果可用的话,完整的反射操作会有更全面的 toString() 方法,因此会出现这个提示消息。


12
没错,就是这样。在 build.gradle 中添加 compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 可以解决这个问题。 - Pravin Sonawane
添加反射库解决了我的构建问题(太好了!),但不允许我构建APK。编译器抛出一个“Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.” 有任何想法为什么,或者如何修复这个问题? - Lucas P.
2
@LucasP. kotlin-reflect 包含许多方法,很可能将您的 APK 方法计数推到了 64K 的限制之上。您可以通过启用 multidex,使用 kotlin.reflect.lite(如果适用),或者简单地忽略警告来解决这个问题。 - nicopico
这个问题似乎在1.3版本中已经被修复了。 - user1677663
1
请添加此库kotlin-reflect - NM Naufaldo

0

添加 kotlin-reflect

 implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0'

我试过了,它可以运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接