java 可变长参数 反射_通过反射调用带可变参数方法运行失败

我通过反射调用一个带有可变参数的方法是运行失败,代码如下。

public class Main {

public static void func(Object... objs){

for (Object obj : objs){

System.out.println(obj);

}

}

public static class Tester{

public static void main(String... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

Class> clazz = Class.forName("com.xxxx.Main");

Method method1 = clazz.getMethod("func", Object[].class);

method1.invoke(null, new Object[]{1, "2"});

}

}

}

异常信息如下

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.zeeker.reflect.Main$Tester.main(Main.java:30)

这其中是有什么猫腻?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用Java反射机制中的getDeclaredMethod()方法来获取有不定参数方法。该方法需要两个参数方法名称和参数类型。在参数类型中,您可以使用“...”来表示不定参数。例如,如果您要获取一个名为“myMethod”的方法,它有一个字符串参数和一个不定参数,则可以使用以下代码: Class<?> clazz = MyClass.class; Method method = clazz.getDeclaredMethod("myMethod", String.class, String[].class); 请注意,这里的“String[].class”表示一个字符串数组,它可以接受任意数量的字符串参数。 ### 回答2: 在JAVA中,使用反射获取有不定参数方法可以通过以下步骤实现。 1. 首先,通过Class类的forName方法获取目标类的Class对象。例如,如果我们要获取名为"TestClass"的类的Class对象,可以使用以下代码: Class<?> clazz = Class.forName("TestClass"); 2. 然后,使用getMethod或getDeclaredMethod方法获取目标方法的Method对象。其中getMethod方法用于获取公共方法,getDeclaredMethod方法用于获取所有方法,包括私有方法。需要注意的是,方法名要与目标方法相匹配。如果目标方法有不定参数的,则需要在方法名后面加上三个点(...)来表示。例如,我们要获取名为"testMethod"的有不定参数方法,可以使用以下代码: Method method = clazz.getMethod("testMethod", String[].class); 3. 最后,可以通过Method对象的invoke方法调用目标方法。例如,如果我们要调用testMethod方法,可以使用以下代码: Object result = method.invoke(null, (Object) new String[]{"param1", "param2"}); 需要注意的是,invoke方法的第一个参数调用方法的对象,如果目标方法是静态方法,则可以将该参数设置为null。之后的参数可以按照目标方法参数类型顺序传入。 总结来说,通过使用Class类的forName方法获取Class对象,再使用getMethod或getDeclaredMethod方法获取Method对象,最后使用invoke方法调用目标方法,就可以实现获取有不定参数方法并进行调用。 ### 回答3: 在Java中,通过反射获取有不定参数方法可以使用`getDeclaredMethod`方法。不定参数可以理解为方法参数个数是可变的。 首先,我们需要使用`Class`类的`getDeclaredMethod`方法。这个方法接受两个参数方法的名称和参数类型。在参数类型位置上,我们可以使用"..."表示不定参数。例如,如果要获取一个名为`methodName`且有不定参数方法,可以使用以下代码: ```java Class<?> clazz = targetObject.getClass(); Method method = clazz.getDeclaredMethod("methodName", parameterTypes); ``` 其中,`targetObject`是调用方法的对象,`parameterTypes`是一个数组,包含了方法参数类型。 在参数类型中,不定参数会被视为数组类型。例如,如果方法定义为`method(String... strs)`,则在参数类型中应该传入`String[].class`。 获取到方法后,可以通过`method.invoke(targetObject, parameters)`来调用这个方法,其中`paramters`是一个包含实际参数值的数组。 需要注意的是,由于不定参数的特殊性,传入的实际参数值应该符合方法参数的个数和类型。如果传入的实际参数个数与不定参数个数不匹配,或者传入的参数类型与不定参数的元素类型不匹配,则会抛出`IllegalArgumentException`异常。 总结来说,通过反射获取有不定参数方法,就是使用`getDeclaredMethod`方法,并在参数类型中使用`"..."`来表示不定参数的数组类型。获取到方法后,可以使用`invoke`方法调用这个方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值