问题阐述
如下代码:
private fun shareUrlToFriend(logoUrl: String) {
activity?.let {
Glide.with(this)
.asBitmap()
.load(logoUrl)
.into(object : CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
print(logoUrl)//就是一个方法使用了logoUrl
}
})
}
}
运行这段代码报java.lang.NoClassDefFoundError错误(表示运行中找不到类的定义)。经过替换尝试,报错不是Glide的锅。根据kotlin默认最后一行是返回值的规则,这代码最后let
下面最后一个返回对象是CustomTarget的匿名内部类对象。因为:
// Glide into()方法
@NonNull
public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) {
return into(target, /*targetListener=*/ null, Executors.mainThreadExecutor());
}
所以,可以把上面代码替换成如下简单代码:
class T {
var a: Any? = null
fun f(u: String) {
a?.let {
object : Inter {
override fun e() {
print(u)
}
}
}
}
}
fun main() {
val t = T()
t.a = Any()
t.f("u")
}
interface Inter {
fun e()
}
这段执行f()
函数代码会报一样的错误。
Exception in thread "main" java.lang.NoClassDefFoundError: com/a/wzm/shere/ui/T$f$1$1
at com.a.wzm.shere.ui.T.f(Test.kt:14)
at com.a.wzm.shere.ui.TestKt.main(Test.kt:28)
at com.a.wzm.shere.ui.TestKt.main(Test.kt)
Caused by: java.lang.ClassNotFoundException: com.a.wzm.shere.ui.T$f$1$1
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 3 more
Process finished with exit code 1
T$f$1$1
是个什么鬼?
问题追溯
查看翻译后的Java代码:
//NO.0 主要看f()函数。
public final