下面代码是对byte数组的反射,但是运行报错,难道byte数组不是用Byte.class表示吗??
报错信息:
java.lang.IllegalArgumentException
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
at java.lang.reflect.Field.set(Field.java:656)
if(fieldclsname.indexOf("byte")>-1){
Class arraycls=Byte.class;
arrayobj = Array.newInstance(arraycls, paraStr.split(",").length);
String[] arraystr=paraStr.split(",");
for(int i=0;i<arraystr.length;i++){
Array.set(arrayobj, i, Byte.parseByte(arraystr[i]));
}
}
Field field=obj.getClass().getDeclaredField(paraname);
field.setAccessible(true);
field.set(obj, arrayobj);

解决方案 »

  1.   

    IllegalArgumentException
    参数类型不对,
     Array.set()第一个参数是个数组,你的是个class
      

  2.   

    你这个field应该是 byte[] 类型的,
    而用Byte.class产生的是 Byte[] ,
    你应该用  Class arraycls=Byte.TYPE; 才能产生byte[];
    可以也难怪下面的代码试一下就可以看出他们的区别了:Object bs;
    bs=Array.newInstance(Byte.class, 100);
    System.out.println(bs.getClass());
    bs=Array.newInstance(Byte.TYPE, 100);
    System.out.println(bs.getClass());
      

  3.   

    Object sss = Array.newInstance(byte.class, 2);
    Array.set(sss, 0, (byte) 'b');
    Array.set(sss, 1, (byte) 'a'); System.out.println(Arrays.toString((byte[]) sss));
      

  4.   

    异常应该是这行抛出的
    field.set(obj, arrayobj)
    需要 byte[] 传入的是 Byte[]
      

  5.   

    用例子说明:
    package com.yilong.test.reflect;
    import java.lang.reflect.Constructor;public class TestByteArray {
    public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("com.yilong.test.reflect.MyClass");
    System.out.println(clazz);
    clazz.newInstance(); Constructor ctr1 = clazz.getConstructor(Byte[].class);
    System.out.println(ctr1);
    Byte[] bytes = new Byte[1];
    ctr1.newInstance(bytes);
    }
    }
    package com.yilong.test.reflect;public class MyClass { MyClass() {
    System.out.println("empty");
    }

    public MyClass(Byte[] bytes) {
    System.out.println("Byte[]");
    }
    }
    有个问题就是如果不是默认的构造函数,其访问权限不是public那么就会报错:
    Exception in thread "main" java.lang.NoSuchMethodException: com.yilong.test.reflect.MyClass.<init>([Ljava.lang.Byte;)
    例如你把上面第二个带参数的访问权限去掉就知道了,这点还不知道为什么?谁能帮忙解决下的?
      

  6.   

    再次飘过的说:
    package com.yilong.test.reflect;
    import java.lang.reflect.Constructor;public class TestByteArray {
    public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("com.yilong.test.reflect.MyClass");
    System.out.println(clazz);
    clazz.newInstance(); Constructor ctr1 = clazz.getConstructor(Byte[].class);
    System.out.println(ctr1);
    Byte[] bytes = new Byte[1];
    ctr1.newInstance(bytes);

    Constructor ctr2 = clazz.getConstructor(byte[].class);
    ctr2.newInstance(new byte[0]);
    }
    }
    package com.yilong.test.reflect;public class MyClass { MyClass() {
    System.out.println("empty");
    }

    public MyClass(Byte[] bytes) {
    System.out.println("Byte[]");
    }

    public MyClass(byte[] b) {
    System.out.println("byte[]");
    }
    }
    打印结果:
    class com.yilong.test.reflect.MyClass
    empty
    public com.yilong.test.reflect.MyClass(java.lang.Byte[])
    Byte[]
    byte[]
      

  7.   

    谢谢12楼。虽然没用你说的办法解决,因为我要得到的是构造方法,不过找到了另外一种方法解决:
    发现有两种方法可以得到类的构造方法:
    (1)得到public(公共的):
    Constructor getConstructor(Class[] params);//得到参数为params的公共的构造方法;
    Constructor getConstructors();//得到所有的公共构造方法;
    (2)不限定访问权限的:
    Constructor getDeclaredConstructor(Class[] params);//得到参数为params的构造方法;
    Constructor getDeclaredConstructors();//得到类中所有构造方法;
    因此对于不是声明为public的,可以这样得到其构造方法:
    Constructor ctr1 = clazz.getDeclaredConstructor(Byte[].class);
      

  8.   

    谢谢ls各位的回复,没向导Byte.class和Byte.TYPE有这么大的区别
    貌似Byte可以赋值给byte啊,数组不行了啊