求教:kotlin中的Long 转化为 Any 后,调用 ::class.java 返回的是java.lang.Long


#1

kotlin 中的 Long 转化为 Any 后,调用 ::class.java 返回的是 java.lang.Long ,这个时候调用getMethod(methodName,paramType )就会出现 NoSuchMethodException .
代码如下:

class A{
    fun getType(  params :Long){
        getMethod(params)
    }

   // 如果这里类型是 Long 就不会有问题
    fun getMethod(params:Any){    
        print(this.javaClass.getMethod("getType",params::class.java))
    }

}

fun main(){
    val a = A()
    a.getType(1L)
}

报错如下:

Exception in thread "main" java.lang.NoSuchMethodException: A.getType(java.lang.Long)
 at java.lang.Class.getMethod (Class.java:1786) 
 at A.getMethod (File.kt:12) 
 at A.getType (File.kt:8) 
 at FileKt.main (File.kt:19) 
 at FileKt.main (File.kt:-1)

如何解决这个问题?


#2

原因是 long 类型经过自动装箱之后变成了 java.lang.Long 的包装类型,而你那个 getType 方法编译出来的参数类型是基本类型的 long,因此自然会找不到这个方法

具体解决办法嘛,根据你的业务需求,想办法绕过去就好


#3

可以试试把 params::class.java 改成 params::class.javaPrimitiveType

但是这样的话,如果 getType 的参数类型是 Long?,你还是会 GG。。。


#4

感谢大佬,改了就解决了,:grinning:


#5

其实还可以试一下 Kotlin 的反射 ,可以完美避开类似的问题:

val function = this::class.functions
    .filter { it.name == "getType" }
    .filter { it.parameters.size == 2 }
    .filter { it.parameters[1].type.classifier == params::class }
    .first()

println(function)

京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务