下面代码是对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);
报错信息:
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);
参数类型不对,
Array.set()第一个参数是个数组,你的是个class
而用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());
Array.set(sss, 0, (byte) 'b');
Array.set(sss, 1, (byte) 'a'); System.out.println(Arrays.toString((byte[]) sss));
field.set(obj, arrayobj)
需要 byte[] 传入的是 Byte[]
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;)
例如你把上面第二个带参数的访问权限去掉就知道了,这点还不知道为什么?谁能帮忙解决下的?
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[]
发现有两种方法可以得到类的构造方法:
(1)得到public(公共的):
Constructor getConstructor(Class[] params);//得到参数为params的公共的构造方法;
Constructor getConstructors();//得到所有的公共构造方法;
(2)不限定访问权限的:
Constructor getDeclaredConstructor(Class[] params);//得到参数为params的构造方法;
Constructor getDeclaredConstructors();//得到类中所有构造方法;
因此对于不是声明为public的,可以这样得到其构造方法:
Constructor ctr1 = clazz.getDeclaredConstructor(Byte[].class);
貌似Byte可以赋值给byte啊,数组不行了啊