元对象是java reflection的物质基础,那它的精神基础又是什么呢?java为什么要支持reflection?经过上面的讨论,我们把这个问题再进一步,为什么java要提供元对象?
讨论这个问题,我们还要拉回到十年前,那时java刚刚来到正式登上历史的舞台。java实际上诞生在这之前的数年,那时候还叫oak,环境所限使得这一划时代的杰作甫一出炉便被束之高阁。当netscape掀起了为网络大戏的序幕,java得以凤凰涅槃,这其中很重要的一个原因就是java是以网络为中心的。
仔细观察,我们会发现,java的整个基础架构的设计都是为网络服务。首当其冲的便是java中最著名的跨平台。其实,在java之前的年代,人们也需要考虑平台之间的可移植性,但这种移植大多数集中在源码一级,这也就是c语言可以流行的原因之一,在单机环境下,平台的差异并不那么明显。网络的出现使平台之间差异凸现出来,因为网络可能会连接各种各样的计算机和设备。没错,还有设备,你也许知道java最初的开发是和嵌入式设备相关的。一旦应用可以跨平台,程序开发和后期管理维护工作将得到极大的简化,可移植性也从源码级晋升到二进制级(java字节码)。所以,跨平台实际上也是为了网络打基础。java中另一个重要的买点——安全性与网络之间的关系更为密切,谁都可以想出几条理由,把二者关联起来。
再来具体看看java的基础架构如何对网络进行支持的。还记得java最初是怎么吸引人的吗?没错,applet。熟悉原理的朋友都知道,applet的运行是把远程的类文件下载到本地来执行的。相对于本地硬盘,网络给我们的感觉就是一个字————慢。如果java采用传统可执行文件组织方式,即一个完整的可执行文件,把整个applet下载下来的运行,只怕等到花儿也谢了。java采用的手法是把文件拆开,以类为单位进行组织,这就是我们今天见到的class文件。这样,执行的过程就变成第一个类下载之后就可以运行,大大节省了最初的等待时间。好的设计会把程序分成若干的模块,所以,绝大多数程序不可能写在一个类中。因此,类文件中必须包含它所用到类。对于引导部分,我们可以让它以特定的方式开始执行,比如把我们耳熟能详的main方法放在特定的字节,但对于没有定法的任意方法,是没有办法规定的,而一个类调用另一个类的方法就是这样随意,因此类文件中必须包含这个类方法的信息,进一步字段信息也会加进来,这样几乎一个完整类的信息就出来了,而这些信息对应的恰好是元对象。所以,元对象出现在java基础架构中。
有了元对象,reflection也成了一件顺其自然的事情。有了reflection,java也就拥有了动态扩展的能力,这样就可以极大的提高程序的灵活性。
关于java基础结构对网络的支持还可以再说几句。class文件经过了精心的设计,本身相当紧凑,其目的就是为了方便在网络上传输,而jar文件的出现,其目的也是为了方便网络传输,因为如果每次只传输一个类,大量的时间都被浪费在建立网络连接的过程中,jar文件使得一次传输多个类成为可能,而且我们还知道jar文件中的数据是经过压缩的,这样可以进一步减少下载时间。java基础架构对网络的支持,《深入java虚拟机》(第二版)的4.3节进行了很好阐述,有兴趣不妨看一下。
对reflection思考让我有机会对java本身的设计进行深入的思考。一个好的软件设计需要一个核心理念作为支撑,所有的一切都是围绕核心进行的,而对于java,这个核心就是网络。
一次有趣的思考体验!
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


