写在开始:
小菜在看java视频的时候发现很多地方提到反射,虽然在.net 中用到过反射,我们的七层架构(简单工厂改造抽象工厂模式+配置文件)中用到了反射。而在学习java的时候也多次谈到反射。Net中的都不是十分的理解,这让小菜就有些 了,雾里看花,水中看月一般~~~ 其实,我们仔细思考一下,不难发现,反射就在我们身边~~~
啥是反射???丫丫的。。
反射,我们抛开计算机,我们生活中处处有反射的。是镜面的反射让我们看到了我们自己的样子;一网友爆料了一个事件,记者会说这个事件反射了什么什么的现象,反射了人物的什么什么品德和心理;是反射能让我们用相机记录了每个精彩的瞬间;光的反射让我们看到了五彩缤纷的世界….
计算机中的反射???
同样,我们回到计算机的世界中去,反射是什么,就如同镜子反射一样,可以看到自己其他人看到的部分。计算机中的反射,是在运行的时候(我们走到镜子前)来自我检查,并对内部成员进行操作。(翻译成大白话是:一个人可以走到镜子前,检查自己,并整理自己认为不整齐不美观的部分)。
.net和java中的反射思想本质就在于此。只不过我们变换了形式,我们变换了不同的“镜子”,其实再能七十二变的孙悟空也只是个猴子,再能“七十二变”的反射也只是“照镜子”,我们抓住本质的思想,一切就都OK了!
我们在哪里用到了反射?
我们可以列举一下。
1、.Net中的无论是简单三层加配置文件(反射)还是简单工厂改造的抽象工厂+配置文件(反射), 其实这里的配置文件就是我们的“镜子”啦。。。为什么工厂Factory不直接和DataAccess相关联?为什么我们在做系统的时候选择使用这个架构?使用这个架构的好处在哪里?是为了系统扩展方便,更方便的换数据库,正是反射机制让Factory工厂不需要知道DataAccess的存在,通过反射来访问数据层,从而降低了耦合性。
2、java中的servlet(见另一篇博文)也是如此,我们通过配置web.xml(“镜子”)让tomcat找到自己的那个servlet,从web.xml 中读取servlet的路径,就是采用了反射的思想来对自己的servlet进行实例化,并且实例化一次(servlet单线程多实例)。
3、刚刚学到jdbc时用过一行代码Class.forName("com.mysql.jdbc.Driver.class").newInstance(); 这用到了反射机制,只不过这个“镜子”没有单独的放到一个文件中,而是通过一窜字符处就行了。
据说JavaBean、ssh、hibernate也用到了反射机制。(小菜还木有学到这里 ,就不一一举例了。。以后会学到还会写博的,敬请关注哦)
历史性的改变—反射思想的提出---“官方”的反射提出:
反射的概念是有Smith(很伟大啊)在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言设计领域所采用,并在面面向对象方面取得了成绩。其中openC++ 、OpenJava(open的也就是开源的)等就是反射机制的语言。
看看sun公司告诉我们他是如何应用反射思想的?
Java是人家sun公司的,所以看看sun的官网上是怎么说的,是这样说的:
http://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Reflectionis a feature in the Java programming language. It allows an executing Javaprogram to examine or "introspect" upon itself, and manipulateinternal properties of the program. For example, it's possible for a Java classto obtain the names of all its members and display them.
The ability to examine and manipulate a Javaclass from within itself may not sound like very much, but in other programminglanguages this feature simply doesn't exist. For example, there is no way in aPascal, C, or C++ program to obtain information about the functions defined withinthat program.
One tangible use of reflection is in JavaBeans,where software components can be manipulated visually via a builder tool. Thetool uses reflection to obtain the properties of Java components (classes) asthey are dynamically loaded.
翻译:
*反射是java语言的一个特性。它允许程序在运行(不是编译)来自我检查并对内部成员进行操作。例如,它允许一个java类获取他所有的成员和方法并显示出来。
*这个检查自己并操作自己的特性我们不常听说,其他程序语言不存在。例如在pascal c程序,没有此功能。
*反射一个实用的应用在JavaBeans中,软件组件可以可视化操作,通过构建工具。该工具实用反射来获取,动态加载java组件(类)的属性。
反射有啥的优点和缺点???(完美在路上…)
优点:
不直接创建对象,而是用反射,这是干嘛,当然是Smith再发现一些弊端,想要变得功能性扩展性更好,所以就开始改变,开始思考,所以反射就出现了。。(和一个人的成长之路是一样的,人总是在慢慢成长,慢慢改变自己,慢慢提高着。。)这就涉及到了我们编译和运行的原理了,编译是把计算机的高级语言编译成计算机可以识别的语言机器语言或低级语言;运行是机器语言执行一定的功能了,程序去调用的东西。可以这样理解,编译是我们吃东西,各种东西,各种吃,当然你在吃的时候会检查这个东西是不是能吃,这个东西是不是坏掉,这个东西是属于蔬菜类的还是属于瓜果类的等,而运行就是你吃完之后,你肚子的胃进行消化吸收了,这个能让你增加维生素a,这个能让你增加维生素B,这个能润肠等等,最终的结果,你有能量可以运动了,可以学习反射机制了,可以思考了。 网上说,打开软件其实就是运行了,也就是运行编译好的exe文件了。我想现在您一定理解了…
我们可以在运行的时候(也可以说成动态编译)创建对象,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,降低了类之间的耦合性。
这也就是软件灵活性所在,一个软件我们第一次设计的不是很完美,当这个程序编译后,发布了,想要更新某些功能,用户不用卸载软件再重新安装,只需要更新一下就ok了!
还记得我们的简单工厂是怎么改造的抽象工厂吗? 没有反射,简单工厂是改造不了抽象工厂的,正是反射机制,让我们可以轻松自如的换数据库。如果公司里一开始用的是access数据库后来想改成sql数据库,还用把整个程序都重新做一遍吗,反射给我们提供了极大的方便,只要把编译好的数据层的dll进行替换就可以啦。这不是为我们程序员省大事了么
缺点:
任何事物都不是完美的,完美总在过程中。就像喜欢一个人的优点的同时就要包容他的缺点一样。它的缺点是对系统性能有影响,使用反射基本上是一种解释操作,并且比直接执行要慢。当然这就需要我们自己来平衡啦(生活的艺术同样是是得失平衡的艺术,反射机制融入生活)。
怕朋友们阅读太长的文章累,具体的反射例子的代码就不写在这里了,网上有很多关于反射具体的例子,相信您和生活一结合都能理解的。反射的一些机制就简单些到这里啦。
写在最后:
java中的类都能“自审”,唐太宗说说过,以铜为镜可以正衣冠,以古为镜可以见兴衰,以人为镜可以知得失矣。生活中的反射无处不在,吾日三省吾身,让我们不断的学习和思考,让世界是我们程序员的!大家一起加油!
感谢朋友们阅读,以上是小菜自己的理解,望提出自己的见解。。万分感激。最后愿都好