个人管理功能

在CSDN Blog撰写技术文章,即有机会入选CSDN技术中心,现在就去免费注册!已注册用户,点击登录

搜索
热门标签
专题历史

有人说SOA是一种IT策略,有人说SOA是一种架构理念,还有人说SOA是一种服务。SOA到底是什么?它将带来什么?软件产业的变革亦或是新的机遇下的挑战?业界权威专家带领我们一起去深究,去探索。BEA三位重量级专家与您共同探讨SOA

随着WPF/E更名为正式名称Silverlight,以及Silverlight 1.1 Alpha 版本的发布,答案变得清晰,而且令人兴奋! - 一个跨操作系统,跨浏览器的Web应用平台出现了。Silverlight 这样一个4.5MB的浏览器插件(1.1 Alpha文件)是如何做到的这些的?周岳: SilverLight-Web应用的一道强光

中国移动用户数量在大踏步地发展与增长,根据产业部的数据,仅三月就新增了670万户。预估计6月份之后,中国很快将迎来第五亿手机用户(平均不到3人拥有一台手机)而J2ME做为最重要的手机跨平台技术,凭借Java平台以其良好的开放性和支持能力,得到了众多手机厂商的支持。对众多开发者来说,J2ME程序易于移植,轻松实现“一次编写,到处运行”。J2ME系列开发专题,将带你从最基本的工具安装,环境配置开始,进入移动应用开发的世界。
 
CSDN移动开发系列之-“J2ME开发实训”

7月31日-8月1日,即将在上海召开甲骨文全球大会•亚太地区会议同期举行的甲骨文开发者大会,这是一项付费参加的面向开发人员的活动。在甲骨文开发者大会期间,您将听到世界一流的专家讲述如何使用Java、.NET、XML和PL/SQL以及Ajax、PHP、Spring、Groovy on Rails等流行技术来简化开发过程。在为期两天的甲骨文开发者大会中,您将能够提高自身的开发技能,扩充知识,参加几十场由专家主持的深入细致的技术讲座并在专家的辅导下进行上机操作、了解高级技能和获得详细指导。在甲骨文开发者大会期间,您有机会直接向业界一流的技术专家和开发人员请教。欢迎参加甲骨文全球大会·2007·亚太地区开发者大会

2007年6月29日,自由软件基金会宣布,其创始人Richard Stallman将在GNU的网站上,在本周太平洋时间星期五上午9点通过视频发布GPLv3。本来,GPL并不是所有开源组织所认可的协议。其从出现以来一直存在争议,GPL被认为是一种“病毒式”的协议,BSD的fans和老牌Unix黑客们认为,他们编写Unix的年头都比GPL声明要长得多,他们更愿意采用比GPL更加的自由的BSD协议。今天,开源社区中有70%左右的项目采用了GPL。很多在开源社区的老牌黑客们认为,Richard Stallman所鼓吹开源软件的言行与当年卡尔·马克思号召产业无产阶级反抗工作的努力如出一辙。在GPLv3的第三版修订案发布时,开源软件团体中的许多成员都反对这种协议。尤其是Linux的核心开发小组,其中29个高级架构师有28个反对这个协议。Linus Torvalds称这个协议有“宗教性质”,并公开反对。而整个软件行业特别是开源社区对GPLv3的争论也愈演愈烈。GPLv3:大教堂和集市的新一轮对抗

2007年7月14日由CSDN与ThoughtWorks联合主办的第二届“敏捷中国”技术大会在北京丽亭华苑酒店召开,多位开源社区和ThoughtWorks公司的技术领袖即将带来精彩的演讲。本次“敏捷中国”技术大会集中展现塑造敏捷企业所需的方方面面:业界领先的敏捷项目管理工具;极大提升软件开发效率的新语言和新框架;数据库领域的敏捷实践;全方位的敏捷项目管理指导;还有身临其境的亲身体验。来自开源社区和ThoughtWorks公司的技术领导者们将带领听众全面感受敏捷企业。“敏捷中国大会”现场直击

从2004年起,在每年的夏季,CSDN都会举办面向中国程序员的大型网上调查活动。这是中国样本最丰富的开发者社区调查,持续、全面和深入地反映了中国开发者社群自身状况、各项技术、工具、产品的使用状况和发展趋势,是完整、准确地了解中国开发者市场的重要参考资料。本次调查覆盖基础信息、.NET、Java、C/C++、Web开发、数据库应用开发、软件工程及项目管理、移动及嵌入式开发、开放源代码、企业信息化等10个领域。还有惊喜大奖等着你哦,赶快进入吧! 2007中国软件开发者大调查正式启动

推荐作者
  • 大宝大宝

    时间如流水,知惜方成功。

  • SkymanSkyman

    江苏人氏,梅兰芳之老乡。现游学渝州之最...

  • ralph623ralph623

新进作者
  • 冲 s冲 s

  • 小鱼小鱼

  • 棱角棱角

    多年J2EE构架设计与开发经验,专注于企业信息系统建设,精通Java设计模式,并能熟练的运用到企业开发中。 精通Struts与Spring框架。数据库方面精通Oracle数据库,从事过数据库方面的开发以及oracle优化方面的工作。

最新技术图书推荐
读javaWeb开发记录-类装载器

发表日期:2007-4-29
更新日期:2007-4-29
作者文章阅读次数:2002

源自:南柯无梦 (个人网站) 标签:java

您认为本文应该得        共有2人参与打分打印|收藏|讨论|投诉

今天刚好看到javaweb开发这本书介绍类装载器,看完之后很受启发,就把它写下来,以备以后使用。

以前对类装载器总是一个模糊的概念,它是如何工作的,实现的机制是什么等等。今天看书刚好看到这一点,就索性记录下来吧。

jvm主要有三部分组成:类装载器,类校验器和类解释器。jvm对于每一个要使用的类首先的任务就是要将类的字节码数据装载进来 ,完成类的装载的功能的就是类装载器。类装载器根据要装载的类的类名来定位和装载类的字节码数据,然后在返回给jvm。通常的类装载器需要根据要装载的类的类名来创建一个.class文件,然后到本地文件系统中读取这个.class文件,再把读取到的数据传送给jvm。但是类装载器并不是要把读取到的字节码数据原封不动的传递给jvm,它需要将.class文件的内容转化位jvm能够接受的字节码数据。例如,在本地文件中,class文件是保存时以GB2312的编码方式保存的,而jvm要求unicode的编码方式,这就需要类装载器来进行转化。其实类装载本身也是以个java类,jvm允许java开发人员编写自己的类装载器,以便使用其他各种不同的特殊方式来进行类的装载。例如我们要对一个.class文件进行加密,防止别人来反编译。这就需要编写一个能进行解密的类装载器,产生一个正常的类字节码。所以我们可以这样理解,类装载器就是一个能够制造出字节码数据的制造器。

类装载器装载完类的字节码数据后,会将这些数据返回给jvm,然后jvm将这些字节码数据编译位可执行的代码存储在内存中,并将索引信息保存在HashTable中,其索引信息就是这个类的完整名称。当jvm 要用到这个类的时候,它就会根据类名作为索引信息在HashTable 查找相应信息,如果可执行代码已经存在,jvm就会从内存中调用可执行代码,否则它就会继续装载和编译要使用的类。

我们知道现实世界上的任何一种事物,无论是有形还是无形的,都可以用一个类来表示。但是我们不可否认的是java中的类也是一种事物,所以它同样也可以用一个java类来进行描述,这个类的名称就是Class。这个类包含了各种方法,用以操作它所描述的类。例如,Class类中有一个getName方法用以获取它所描述的类的名称。可以认为,类装载器装载字节码数据的过程就是创建一个Class类的实例对象,这个Class实例对象所封装的内容就是刚才被装载的字节码数据,也就是jvm对当前加载类编译后存储载内存中的可执行代码。要在程序中获得代表某个类的字节码数据的Class实例对象,可以用以下三种方法:1.类名,class  2.对象.getClass() 3.Class,forName(类名)

下面我们就着重来谈谈类装载器的实现机制:在一个java虚拟机中可以有多个类装载器,当java虚拟机要装载一个类时,它通过以下一些方式来选择类装载器。

(1)一个类装载器本身也是一个java类,所有,类装载器自身也需要被另外一个类装载器装载,这就出现了类似人类的第一位母亲是如何产生出来的问题,虽然人类的这个问题至今也没一个确切的答案,但java中的类装载器的这个问题却很容易解决。java 虚拟机中内嵌了一个称为Bootstrap的类装载器,它是用特定于本地操作系统的代码来实现的,属于java虚拟机的内核,这个Bootstrap类装载器不需要其他的类装载器来装载,它主要用于装载java核心包中的类(即rt.jar文件中的类)。java核心包中有另外两个类装载器,即ExtClassLoader装载器和AppClassLoader装载器,它们都是用java语言编写的java类,其中ExtClassLoader类装载器负责装载存放载<JaVA_HOME>/jre/lib/ext目录下的jar包中的类,AppClassLoader负责加载应用程序的启动执行类。在编译和运行java程序时,都会通过ExtClassLoader来加载<JDK安装主目录>jre\lib\ext目录下的jar包来搜索要加载的类。其实如果将servlet.jar包复制到该目录下,就不需要在classpath环境变量中指定了。

一个java虚拟机中的所有的类装载器都时采用父子关系的树形结构组织的 ,在实例化每个类装载器的时候,都需要为其指定一个父级装载器的实例对象,如果没有指定这个父级类对象,则以ClassLoader.getSystemClassLoader()方法返回一个系统级类装载器,这个系统级类装载器就是AppClassLoader类装载器,它是在getSystemClassLoader()第一次被调用时设置的,即应用程序启动的早期被设置的。

每个类装载器只能分别装载特定位置和目路的类,但是ClassLoader被设置成了委托级模式,使得每一个类装载器都可以委托它的父级类装载器去加载类,而让应用程序可以借助子级类装载器来查找和装载更多的类。ClassLoader会通过loadClass()方法来查找这个类是否被装载,如果没有被装载,则委托它的父级类装载器去装载,如果父级类装载也没能够装载这个类,子级类装载器才会通过findClass()方法去真正装载那个类。父级类装载器调用loadClass()方法去装载一个类时,它也是先查找父级类装载器,这样一直追加到Bootstrap类装载器,如果它也没能够装载,则会回推到最初的类装载器,如果也没能装载,此时就会报告一个ClassNotFoundException的异常。

一个类装载器只能创建某个类的一份类字节码数据,即只能创建一个Class实例对象,而不能为同样一个类创建多个Class实例对象。我们可以看出采用委托模式给类加载管理带来了明显的好处当父级类装载加载了某个类,那么子级类装载器就不要再装载这个类了,这样就可以避免 一个java虚拟机的多个类装载器为同一个类创建多个类字节码数据的情况啦  。只要开发人员在编写自己的类装载器的时候,不去覆盖loadClass()方法,而覆盖findClass()方法,这样就可以继续使用委托模式。我们要闹闹记住下面一段话:依据一个类特定存放位置,这个类最终只能够被一个类装载器来装载,对于一个已被父级类装载器装载的类来说,java虚拟机默认使用这个父级类装载器来装载它所调用的其他类。由于一个父级类装载器不能委托子级类装载器进行装载类,因此一般情况下,一个已被父级类装载器装载的类不能够调用只能被子级类装载器装载的其他类。

您认为本文应该得        共有2人参与打分打印|收藏|讨论|投诉

暂无图片

我对编程很感兴趣 希望贵论坛能给我一个新的感受

作者其他文章: 更多
相关文章:
评论

CSDN技术中心团队官方Blog:http://blog.csdn.net/techcenter/,反馈邮箱:techcenter at csdn.net (注意:请把 at 换成@)


网站简介广告服务网站地图帮助联系方式诚聘英才English问题报告

北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号

世纪乐知(北京)网络技术有限公司 提供技术支持

Copyright © 2000-2008, CSDN.NET, All Rights Reserved