先说结论

有以下几种情况有可能产生会产生数组型反射无法找到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虚拟机规范"

11-30 19:29