欢迎来到天天文库
浏览记录
ID:18553104
大小:72.50 KB
页数:13页
时间:2018-09-18
《深入理解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,
此文档下载收益归作者所有