java – 使用Proxy时,为什么Kotlin会抛出IllegalArgumentException
作者:互联网
这是使用InvocationHandler的Kotlin等效的Java代码:
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
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
Kotlin使用标准Java类的原因是什么?
解决方法:
当您将args传递给Kotlin中的方法!!.invoke(obj,args)时,它实际上是数组类型的单个参数,并且默认情况下它不会作为单独的参数分解为其元素.
要实现该行为,请使用spread operator:* args
val ret = method!!.invoke(obj, *args)
使用这种语法,args将以与Java varargs相同的方式传递.例如,这些代码行是等效的:
someVarargsFunction("a", "b", "c", "d", "e")
someVarargsFunction("a", "b", *arrayOf("c", "d"), "e")
注意:如果方法没有任何参数,args将为null,并将其传播到Kotlin将导致NullPointerException.作为一种解决方法,使用*(args?:arrayOfNulls< Any>(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<Any>(0)))
println("After; result: $ret")
ret
} as SomeInterface
println(a.f(1, 2))
输出是:
06004
标签:proxy-classes,java,kotlin 来源: https://codeday.me/bug/20190823/1701643.html