当前位置:  开发笔记 > 编程语言 > 正文

使用Proxy时,为什么Kotlin会抛出IllegalArgumentException

如何解决《使用Proxy时,为什么Kotlin会抛出IllegalArgumentException》经验,为你挑选了1个好方法。

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

override fun invoke(proxy: Any?, method: Method?, args: Array?): 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使用标准Java类的原因是什么?



1> hotkey..:

当你args进入method!!.invoke(obj, args)Kotlin时,它实际上是数组类型的单个参数,并且默认情况下它不会作为单独的参数分解为其元素.

要实现该行为,请使用spread运算符:*args

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

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

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

注意:如果一个方法没有任何参数,那么argsnull它传播到Kotlin会产生一个NullPointerException.作为一种变通方法,使用*(args ?: arrayOfNulls(0)),并在描述的角落情况下,选择正确的部分并将其扩展为零参数.


我的示例代理实现:

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(0)))
    println("After; result: $ret")
    ret
} as SomeInterface

println(a.f(1, 2))

输出是:

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


@EugenPechanec有趣的是`*arrayOfNulls (0)`工作了!但为什么?为什么null不够
@WenChao,它是一样的:因为`null`传递的是*one*参数,而`*arrayOfNulls (0)`传播为none.:)
感谢大家,我已经用'args == null`解释的角落更新了答案.
推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有