首页 Android 正文
  • 本文约1386字,阅读需7分钟
  • 82
  • 0

Kotlin在使用代理时抛出IllegalArgumentException

摘要

问题描述这是使用InvocationHandler的Java代码的Kotlin等效项: override fun invoke(proxy: Any?, method: Method?, args: ...

问题描述

这是使用InvocationHandler的Java代码的Kotlin等效项:

override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any {
    println("before httprequest--->" + args)
    val ret = method!!.invoke(obj, args)
    println("after httprequest--->")
    return ret
}

Java代码:

public Object invoke(Object o, Method method, Object[] args) throws Throwable {
    System.out.println("jdk--------->http" + args);
    Object  result=method.invoke(target, args);
    System.out.println("jdk--------->http");
    return result;
}

在两种情况下args为null,但是如果我运行它,则Kotlin代码给出了异常Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments

推荐答案

在Kotlin中将args传递到method!!.invoke(obj, args)时,它实际上是数组类型的单个参数,默认情况下不会分解作为单独的参数.要实现该行为,请使用 spread运算符:*args

val ret = method!!.invoke(obj, *args)

使用这种语法,将以与Java varargs中相同的方式传递args.例如,这些代码行是等效的:

someVarargsFunction("a", "b", "c", "d", "e")
someVarargsFunction("a", "b", *arrayOf("c", "d"), "e")

注意:如果某个方法没有任何参数,则args将为null,并将其在Kotlin中传播将导致为NullPointerException.作为解决方法,请使用*(args ?: arrayOfNulls(0)),然后在描述的特殊情况下,选择正确的部分并将其扩展为 zero 自变量.示例代理实现:

interface SomeInterface {
    fun f(a: Int, b: Int): Int
}

val obj = object : SomeInterface {
    override fun f(a: Int, b: Int) = a + b
}
val a = Proxy.newProxyInstance(
        SomeInterface::class.java.classLoader,
        arrayOf(SomeInterface::class.java)) { proxy, method, args ->
    println("Before; args: " + args?.contentToString())
    val ret = method!!.invoke(obj, *(args ?: arrayOfNulls<Any>(0)))
    println("After; result: $ret")
    ret
} as SomeInterface

println(a.f(1, 2))

输出为:

Before; args: [1, 2]
After; result: 3
3
标签:kotlin

扫描二维码,在手机上阅读


    评论