String[]与反射产生的矛盾

 我们通常使用java反射很简单,直接使用method.invoke(obj,params)即可,但是当我们面对方法的入参为数组时会有问题,会报错:Exception in thread “main” java.lang.IllegalArgumentException: wrong number of arguments,字面意思是参数数量不正确,但是你反复检查也看不出怎么就数据量正确了,其实原因是这样的:

 JDK在1.5版本之前,Java没有可变参数这种东西,多个不定数量的参数使用数组来传递,1.5版本之后才加入了可变参数这个功能,这样一来,以前的程序就会运行错误,出现不兼容问题。为了跟1.5以前的程序兼容,一个方法中接受可变参数的地方,如果传入数组,就会自动分解为多个参数。

 比如你的方法的入参为String[] args,然后你反射调用时传入new String[]{“a”,“b”} ,然后就会被分解成"a","b"两个字符串参数,而你的方法入参其实只有个Stirng[]参数,所以就会有前面的报错wrong number of arguments,知道原因我们该怎么解决呢?

  1. 既然数组会被分解,那我们就不传数组传一个对象,即(Object) new String[]{“a”,“b”},把数组转换成一个Object对象。

  2. 既然他会分解,那我就包两层,即new Object[]{new String[]{“a”,“b”}},这样他会把外面的一层Object分解,分解后变成了new String[]{“a”,“b”},就满足条件了,具体代码如下:

我们通常使用java反射很简单,直接使用method.invoke(obj,params)即可,但是当我们面对方法的入参为数组时会有问题,会报错:Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments,字面意思是参数数量不正确,但是你反复检查也看不出怎么就数据量正确了,其实原因是这样的:

JDK在1.5版本之前,Java没有可变参数这种东西,多个不定数量的参数使用数组来传递,1.5版本之后才加入了可变参数这个功能,这样一来,以前的程序就会运行错误,出现不兼容问题。为了跟1.5以前的程序兼容,一个方法中接受可变参数的地方,如果传入数组,就会自动分解为多个参数。

比如你的方法的入参为String[] args,然后你反射调用时传入new String[]{"a","b"} ,然后就会被分解成"a","b"两个字符串参数,而你的方法入参其实只有个Stirng[]参数,所以就会有前面的报错wrong number of arguments,知道原因我们该怎么解决呢?

(1)、既然数组会被分解,那我们就不传数组传一个对象,即(Object) new String[]{"a","b"},把数组转换成一个Object对象。

(2)、既然他会分解,那我就包两层,即new Object[]{new String[]{"a","b"}},这样他会把外面的一层Object分解,分解后变成了new String[]{"a","b"},就满足条件了,具体代码如下:

public class ReflectQuestion {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        ReflectQuestion reflectQuestion = ReflectQuestion.class.newInstance();
        Method method = ReflectQuestion.class.getDeclaredMethod("test",String[].class);
        //错误
        method.invoke(reflectQuestion,new String[]{"aa","bb"});
        //正确
        method.invoke(reflectQuestion,(Object)new String[]{"aa","bb"});
        //正确
        method.invoke(reflectQuestion,new Object[]{new String[]{"aa","bb"}});
    }

    public void test(String[] args){
        if(args!=null){
            for(String arg:args){
                System.out.println("args="+arg);
            }
        }

    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值