我试图通过在数组中传递方法的调用参数来通过反射调用方法。Params 是一个 List [Any] 并带有要传递给反射方法的值。
// make absolutely sure it's of the correct type
val args : Array [Object] = params.map (_.asInstanceOf [java.lang.Object]).toArray
System.err.println ("target method: " + method.getName + " :: " + method.getParameterTypes.toList)
System.err.println ("parameters : " + args.getClass.getCanonicalName + "\n " +
(args map (p => (p.getClass.getCanonicalName, p))).toList)
method.invoke (host, args)
我得到以下输出,看起来都不错。被调用方法的签名与参数列表完美匹配。
target method: echo :: List(class java.lang.String)
parameters : java.lang.Object[]
List((java.lang.String,looks good))
可悲的是,调用抛出 java.lang.IllegalArgumentException: argument type mismatch
根据 Java 文档,可变参数参数(作为 Method.invoke 的参数)可以与 Object[] 一起提供。我难住了!