深入理解java加载类的机制

深入理解java加载类的机制

ID:18553104

大小:72.50 KB

页数:13页

时间:2018-09-18

深入理解java加载类的机制_第1页
深入理解java加载类的机制_第2页
深入理解java加载类的机制_第3页
深入理解java加载类的机制_第4页
深入理解java加载类的机制_第5页
资源描述:

《深入理解java加载类的机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、深入理解Java加载类的机制这里从三个方面讲述javaclassloader1、翻译一下classloader的相关技术文章(来自CoreJava第二卷的Chapter9.Security),由于我的英文水平有限,难免有不合适,请大家指出。2、将从web应用出发模拟一下web应用的classloader(这节是重点)3、通过测试2实现的classloader来加深理解  以下是翻译的关于ClassLoader介绍   ClassLoader  JAVA编译器把源代码转换成一个假想机器(就是我们所说的虚拟机)的语言。虚拟机指令被保存在class后缀的文件里。每一个类文件包含类和接口的定

2、义以及实现代码。这些类文件必须被一个程序解释,这个程序能够把虚拟机的指令翻译成宿主机的机器语言。  注意:虚拟机只加载执行一个程序所需要的类文件。举个例子,比如执行MyProgram.class,虚拟机运行的步骤如下:1、虚拟机有一个加载类文件的机制,比如,从硬盘读取文件或者就网络获得;虚拟机用这个机制加载MyProgram的类文件2、如果MyProgram有一个实例变量或者是超类,那么实例变量和超类的类文件也被加载。(加载一个类所依赖的所有类的过程叫做resolvingtheclass--》自己理解吧)3、然后虚拟机执行MyProgram的main方法(因为是静态方法,所以不需要n

3、ewMyProgram的实例)4、如果main方法或者main方法调用的方法需要其他的类的话,这些类也被加载。  类加载机制不是仅仅用一个类加载器,任何一个java程序至少有以下三个类加载器(为了不影响大家的理解,这里我就不翻译这三个类加载器的名称了)  Thebootstrapclassloader:加载系统类(有代表性的,jdk的rt.jar里的类),他是虚拟机的必要组成部分,并且一般是用C实现的。  也有类加载器对象(就是指具体的一个类加载器)不关联bootstrapclassloader,比如String.class.getClassLoader()返回null.  Thee

4、xtensionclassloader:加载jre/lib/ext目录下的class,你可以把你的jar文件放到这个目录,extensionclassloader将会加载到jar里面的类,即使你不设置classpath.(一些人建议使用这个机制以让你不受classpath的烦扰,不过注意以下的警告)Thesystemclassloader(有时也叫应用程序加载器):加载应用程序类。  他主要加载classpath目录和jar/zip文件里的class,通过设置CLASSPATH环境变量或者是运行java的时候用[-classpath]选项指定classpath在SUN的java实现里

5、,theextensionandsystemclassloaders都是用java实现的,他们都是URLClassLoader类的实例。  警告:如果你把jar文件放到jre/lib/ext目录下,并且你的jar文件中的类需要加载一个不是systemorextension的类的话,你将遇到麻烦。扩展类加载器不使用类路径。如果你想把类放到jre/lib/ext下进行管理的话,请牢记这一点。  ==》怎么理解这一点:也就是说如果你把自己的x.jar放到jre/lib/ext下的话,如果你自己的x.jar里的class要用到不在x.jar里也不在jre/lib/ext的类的话,会导致类加载

6、不了。不难想象吧,因为你x.jar里的类是由extensionclassloader加载的,他不会加载classpath路径下的类。  警告:把jar文件放到jre/lib/ext目录下,还有第二个缺陷:有时侯,程序员忘记了他很久以前放在这个目录下的类文件。  当classloader似乎忽略了类路径(其实没有,因为类加载总是先让父的类加载器加载类,只有父的类加载器加载不了的话才由自己来加载,“extensionclassloader是systemclassloader的父,因此。..”),而加载了放在扩展目录下的遗忘已久的类的时候,他们就会迷惑不解。  classloader有父子

7、关系,bootstrapclassloader以外的每一个classloader都有一个父的类加载器。  类加载器会给父的加载器一个机会加载任何给定的类,如果父加载器加载失败的话自身才去加载。  举个例子,当系统classloader被要求加载一个系统类的时候(比如,java.util.ArrayList),那么,首先需要extensionclassloader加载,而extensionclassloader又先让bootstrapclassloader,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。