Java的反射机制是Java语言很重要的一个特性,先从Sun官网上看一下官网是如何定义反射机制的。
大致翻译一下,翻译的可能不是很准确。反射(Reflection)是Java程序设计语言的一个特性,它要求Java程序运行的时候检查或自检,并且对内部的属性进行操作。例如,它可以让一个Java类获得它自己所有的成员名称并且显示出来。这种能够从一个Java类内部进行检查和操作的能力听起来可能不是很受喜欢,但是在其他程序语言中这种特性(功能)根本就不存在。例如,对于Pascla、C或者C#程序就没有办法来获得其内定义的函数。另一个实实在在存在的反射的例子就是在JavaBeans中,软件组件可以通过构造器来操作。这个构造器就是利用反射来获得Java的属性(类)因为它们是动态加载的。
换句话,通俗一点来理解Java的反射机制,就是在运行状态下,对于任意一个类都能动态获得其类下的属性和方法,对于任意一个对象都能够调用它的任意一个方法。这种动态获取信息和动态调用对象的方法的功能称为Java的反射机制,而且这种机制是Java语言所特有的的,是别的程序设计语言所不具备的。
现在很多开源框架都使用反射机制,像Hibernate、Struts都是利用反射机制来实现的。但是我们为什么要用反射机制呢?想想我们以往是如何实现的,在编译的时候确定一个类型,比如一个类或者一个对象,都是写死的,固定写好,然后实例化对象或者去调用某个方法,这种方式叫做静态编译。那么与之对应的就是动态编译了,也就是我们这篇博客讲的Java反射,它的实现原理是在运行的时候再确定类型,然后绑定对象。这种动态编译的特性极大限度的发挥了Java语言的强大功效,增强了Java的灵活性,体现了多态的应用。
如果上面那么说你还不能理解,那就换种方式。Java的反射就是指在程序运行时能够获取自身的信息,在Java中只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。想想我们在OA时运用的反射机制因为不确定传进来是哪个实体,是Role还是Apartment还是User,就利用Java的反射机制Class
现在有了Java的反射机制,我们就得从原来的的老圈子里跳出来。想想人类真是聪明,开发出工具也就算了,还想着不断改进怎么能复用性高、效率高。所以我们现在用Java的反射机制,只创建一个Dao类,然后把增删改查的方法写进去,但是把类型空出来,到时候只要传入不同类型的对象就可以操作了,无需有多少表就创建多少个Dao类,反射机制会自动帮我们做这件事。就好比有个酒窖有三个酒缸,分别装着蓝酒、绿酒和黄酒,酒窖老板每天在门口摆一种酒缸放在门口卖酒。以前的做法就是:比如今天卖蓝酒,就搬着装蓝酒的酒缸放在门口;买绿酒就搬着绿酒的酒缸到门口。后来一个伙计想了一个办法,就是在门口放一个空酒缸,安一个龙头在酒缸上,今天想卖什么酒直接往门口的酒缸里面注就行了,这样就不用来回搬着酒缸了。呵呵,多么笨的老板,当然这个故事是我杜撰的,目的只是想讲明白Java的反射机制.
所以回过头来说,Java的反射机制可以实现动态创建对象和编译,为了更好的理解,我们再来杜撰一个例子。现在我是一个班主任,我以前是这么分配工作的,小红负责扫地;小蓝负责擦玻璃;小黑负责擦黑板;小黄负责倒垃圾,每个人只负责自己的工作,我看到地没扫,就得记着安排小红去扫地......
但是这样分配工作效率很低,因为我每每想着要安排一个工作,就得想着安排哪个固定的人员去做这件事。所以有了Java反射机制之后,我更改了以往的安排工作的方式。
这样一来,利用Java的反射机制,你也不知道你要new哪个对象去做什么工作,原来直接创建对象去执行相应的工作,现在利用Java的反射机制,在程序运行的过程中,动态创建对象然后去调用它的任意一个方法和属性去执行其职能。不知道这样讲你对Java的反射机制明白了没有?下篇文章我会介绍通过Java的反射机制读取Jar包的类名和属性,敬请期待吧!