kotlin能否将java 反射取到method转换为高阶函数? 如果可以如何操作?

kotlin能否将java 反射取到method转换为高阶函数? 如果可以如何操作?
这里只是举一个例子,实际执行会报错。

class A {
    fun haveFun(s:String){
        print(s);
    }
}

fun main(args: Array<String>) {
    val forName = Class.forName("com.gwsoft.tests.A")
    forName?.let {
        val method = forName.getMethod("haveFun", String::class.java)
        method?.let {
            val fu=method as ((s:String)-> Unit)//这里并不行 会报java.lang.reflect.Method cannot be cast to kotlin.jvm.functions.Function1
            fu("呵呵呵");
        }
    }
}
阅读 4.8k
4 个回答

可以通过定义匿名函数赋值给一个函数变量:

class A {
    companion object {
        @JvmStatic
        fun haveFun(s: String) {
            println(s)
        }
    }
}

fun main(args: Array<String>) {
    val clazz = Class.forName("sample.packageName.A")
    val hello: (String) -> Unit = fun (param: String) {
        clazz.getDeclaredMethod("haveFun", String::class.java).invoke(null, param)
    }
    hello("呵呵呵")
}

不过注意示例代码中给的 haveFun 函数在 Java 中并不是 Static 的,因此反射时需要一个 receiver 来执行。

新手上路,请多包涵

反射不行的吧,不过对于单抽象方法的接口(SAM Type),Kotlin 在调用 java 时,有一个 SAM 转换的机制,从而可以使用 lambda ~
比如 view.post{dosomething()},相当于把需要 Runnable 接口的 post 函数转换成了一个高阶函数。

更多: http://www.jianshu.com/p/6386...

val fs = fun (s: String) { return method.invoke(s) }

纯手打没试,就那意思,不是用as,用方法或者lambda包装一下,

如果你只是希望覆盖实现,还是乖乖使用继承吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题