反射(Reflection)是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时通过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现的interfaces,也包括field(属性)和methods(方法)的所有 信息,并可于运行时改变fields内容或调用 Constructor,methods。
什么是反射,简单地说,就是在程序运行是来检查已知名称的Class中的内部信息,那么动态和反射又是什么关系呢。从某种程度上讲,动态是依靠反射来实现的。
以上简单的文字描述应该已经可以为动态与反射下个粗略的定义,让人了解大概是个什么东东。接下来更进一步具体分析,就得来看看简单的代码示例。
这是静态绑定的情况:
// 静态编译/静态绑定 IVehicle vehicle = new BMW(); vehicle.forward(100);
这种情况不必多说,下面来看看动态绑定的情况:
// 动态编译/绑定/运行时多态 // 1.载入类对象 Class c = Class.forName("ref.BMW"); // 2.调用默认无参构造器生成对象 Object object = c.newInstance(); // 3.强制转型 IVehicle ve = (IVehicle) object; ve.forward(500);
从这里我们就来看动态绑定和静态绑定之间的区别。静态绑定在编译的过程中就会进行检验,假设找不到BMW这个类,编译就会出错。而动态绑定的时候,如果找不到这个类,是否也会出错呢?答案是否定的,这个时候是能够通过编译的。但是在运行时,会抛出一个ClassNotFoundException。
那么反射又是怎么一会事呢,简单的说就是根据类名得到类的内部信息。下面就是反射的一些简单代码示例。
// 得到类名 String className = c.getName(); System.out.println("className:" + className); // 得到类中的方法对象数组 java.lang.reflect.Method[] methods = c.getMethods(); for (int i = 0; i < methods.length; i++) { System.out.println("methods:" + methods[i].getName()); } // 得到类定义的构造对象数组 java.lang.reflect.Constructor[] cons = c.getConstructors(); for (int i = 0; i < cons.length; i++) { System.out.println("cons:" + cons[i].getName()); } // 得到类定义的属性对象数组 java.lang.reflect.Field[] fields = c.getFields(); for (int i = 0; i < fields.length; i++) { System.out.println("fields:" + fields[i].getName()); } // 得到类的直接父类对象 Class superClass = c.getSuperclass(); System.out.println("superClass:" + superClass.getName()); // 得到类所有实现的接口类对象数组 Class[] interfaces = c.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { System.out.println("interfaces:" + interfaces[i].getName()); }
下面来看看输出。
className:ref.BMW
methods:forward
methods:startMe
methods:getEnergy
methods:wait
methods:wait
methods:wait
methods:hashCode
methods:getClass
methods:equals
methods:toString
methods:notify
methods:notifyAll
cons:ref.BMW
cons:ref.BMW
fields:company
fields:energy
superClass:java.lang.Object
interfaces:ref.IVehicle
这就是所谓的反射了。当然,这里只是列举了一小部分,反射的功能远非这些,其应用和所带来的便利也不是一下子能说尽的。这里只是作为一个菜鸟对动态和反射提出了一些自己的理解罢了。