Kotlin中如何引用Java可变长参数类型用于反射调用?
Kotlin 反射匹配 Java 可变长参数类型方案
Java 语法中的可变长参数 T... 本质是编译期语法糖,最终会被编译为 T[] 数组类型,因此反射查找方法时直接传入对应数组的 Class 对象即可完成匹配。
针对你需要的 String... 类型,空缺位置直接填入 Array<String>::class.java 即可,修正后的完整代码如下:
val method: Method = SomeActivity::class.java.getDeclaredMethod( "someMethod", Int::class.java, Int::class.java, Array<String>::class.java ) method.isAccessible = true // 单参数调用 method.invoke(activity, 0, 0, "test") // 多参数调用,传入数组即可 method.invoke(activity, 0, 0, arrayOf("test1", "test2"))
注意事项
- 如果要匹配基本类型的可变长参数(比如
int...、long...),需要使用 Kotlin 对应基本类型专属数组的 Class 对象:比如int...对应IntArray::class.java,不可误用Array<Int>::class.java,后者对应 Java 的Integer[]包装类型数组,无法匹配基本类型的可变长参数。 - 调用
invoke执行方法时,可变长参数位置既可以直接传入单个对应类型的对象,也可以传入对应类型的数组来传递多个参数。
内容的提问来源于stack exchange,提问作者PhantomThief
相关产品推荐
相关产品推荐

