先说结论
有以下几种情况有可能产生会产生数组型反射无法找到Class的情况
- 核对class名称的是否是全类路径名,类名有大小写的情况,例如把String写成了stirng
- 碰到过说是jdk的版本的问题,在jdk5以及之前的版本是可以直接通过class.forName获取到数组型类型的,但是jdk6之后没有了,需要增加
-Dsun.lang.ClassLoader.allowArraySyntax=true
这个jvm参数,但是经过实验之后此参数无效 - 注意完整写法
Class.forName("[Ljava.lang.String;");
要注意前面的 [ 和后面 ;,通常的情况下 [ 这个不会忘记,但是很容易把后面的 ; 给忘掉
如何获取一个类的字段描述符
要是想获取一个类的描述符,可以用下面方式获取
System.out.println(String.class.getName());
System.out.println(String[].class.getName());
System.out.println(boolean.class);
会输出下面结果
java.lang.String
[Ljava.lang.String;
boolean
基本类型的字段描述符
Java字节码中FieldType中的字段描述符解释表
例如:描述int实例变量的描述符是I。
Object类型的实例,其描述符好是Ljava/lang/Object;。但是我们在反射实例化的时候不能用/,得用. Class.forName("java.lang.String");
但是如果实例化数组类型就会出错 Class.forName("[Ljava.lang.String")
,正确的写法是Class.forName("[Ljava.lang.String;")
二维数组表示为[[D 相当于double[][]
参考
[[1]]: https://stackoverflow.com/questions/3512709/java-web-start-and-allowarraysyntax-is-not-set "Java Web Start and allowArraySyntax is not set"
[[2]]: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2 "Java虚拟机规范"