public class Main { public static void main(String args[]){ int a[] = new int[10]; Class clazz = a.getClass(); System.out.println(clazz.getName()); } } 在SUN JDK 1.6上运行上述代码,输出为:
找来找去,在JDK的代码中没有找打'[I'这个类。想想也对,'[I'都不是一个合法的标识符,肯定不会出现public class [I {...}这样的Java代码。我们暂且不管[I类是谁声明的,怎么声明的,先用反射机制一探究竟吧。
public class Main { public static void main(String[] args) { int a[] = new int[10]; Class clazz = a.getClass(); System.out.println(clazz.getDeclaredFields().length); System.out.println(clazz.getDeclaredMethods().length); System.out.println(clazz.getDeclaredConstructors().length); System.out.println(clazz.getDeclaredAnnotations().length); System.out.println(clazz.getDeclaredClasses().length); System.out.println(clazz.getSuperclass()); } } 在SUN JDK 1.6上运行上述代码,输出为:
0 0 0 0 0 class java.lang.Object 可见,[I这个类是java.lang.Object的直接子类,自身没有声明任何成员变量、成员方法、构造函数和Annotation,可以说,[I就是个空类。我们立马可以想到一个问题:怎么连length这个成员变量都没有呢?如果真的没有,编译器怎么不报语法错呢?想必编译器对Array.length进行了特殊处理哇!
public class Main { public static void main(String[] args) { int a[] = new int[2]; int i = a.length; } } 使用SUN JDK 1.6编译上述代码,并使用jclasslib打开Main.class文件,得到main方法的字节码: