Java反射如何正确获取带有String...可变参数的initClient方法
问题原因分析
- 第一个参数类型匹配错误:原方法首个参数是基本类型
boolean,你之前传入的Boolean.class是包装类的类型,二者在Java反射的方法匹配规则中属于完全不同的类型,无法匹配。基本类型对应的Class对象要使用boolean.class(也可以用Boolean.TYPE,二者等价)。 - 可变参数的匹配规则:Java中的
String...可变参数是语法糖,编译后方法签名里会自动转为String[]类型,所以反射获取方法时可变参数对应的类型需要传入String[].class,你第二种写法的可变参数类型是对的,但是第一个参数类型错了才导致匹配失败。
正确写法
final Method runClientMethod = clientClass.getMethod("initClient", boolean.class, String[].class);
调用注意事项
通过Method.invoke执行该方法时,需要注意可变参数的传参规则:如果要传入多个字符串作为可变参数,需要将字符串数组强转为Object类型,避免JDK将数组展开为多个独立参数导致参数数量不匹配:
// 示例:调用initClient(true, "config1", "config2") Client client = (Client) runClientMethod.invoke( // 静态方法的invoke第一个参数传null null, true, // 强转Object避免数组被展开 (Object) new String[]{"config1", "config2"} );
内容的提问来源于stack exchange,提问作者asdasd31
相关产品推荐
相关产品推荐

