欢迎来到天天文库
浏览记录
ID:37852239
大小:239.28 KB
页数:23页
时间:2019-06-01
《ClassLoader详解-免费》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、bcincwq2004love@163.comJVM类加载本文是上篇JVM详解的后续.讲解JVM的ClassLoader子系统原理.若有疑问目录1.Java虚拟机类加载器结构简述21.1JVM三种预定义类型类加载器21.2类加载双亲委派机制介绍和分析21.3类加载双亲委派示例31.4java程序动态扩展方式31.5常见问题分析32.再分析类加载3bcincwq2004love@163.com1.Java虚拟机类加载器结构简述1.1JVM三种预定义类型类加载器
2、我们首先看一下JVM预定义的三种类型类加载器,当一个JVM启动的时候,Java缺省开始使用如下三种类型类装入器:启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将/lib下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。标准扩展(Extension)类加载器:扩展类加载器是由Sun的ExtClassLoader(sun.misc.Launch
3、er$ExtClassLoader)实现的。它负责将/lib/ext或者由系统变量java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。系统(System)类加载器:系统类加载器是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。除了以上列举的三种类加载器,还有一种比
4、较特殊的类型就是线程上下文类加载器,这个将在后面单独介绍。a.BootstrapClassLoader/启动类加载器主要负责jdk_home/lib目录下的核心api或-Xbootclasspath选项指定的jar包装入工作. b.ExtensionClassLoader/扩展类加载器主要负责jdk_home/lib/ext目录下的jar包或-Djava.ext.dirs指定目录下的jar包装入工作 c.SystemClassLoader/系统类加载器主要负责java-classpath/-Djav
5、a.class.path所指的目录下的类与jar包装入工作. d.UserCustomClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)在程序运行期间,通过java.lang.ClassLoader的子类动态加载class文件,体现java动态实时类装入特性.1.2类加载双亲委派机制介绍和分析在这里,需要着重说明的是,JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如
6、果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。bcincwq2004love@163.com图一标准扩展类加载器继承层次图图二系统类加载器继承层次图通过图一和图二我们可以看出,类加载器均是继承自java.lang.ClassLoader抽象类。我们下面我们就看简要介绍一下java.lang.ClassLoader中几个最重要的方法://加载指定名称(包括包名)的二进制
7、类型,供用户调用的接口publicClass>loadClass(Stringname)throwsClassNotFoundException{//…}//加载指定名称(包括包名)的二进制类型,同时指定是否解析(但是,这里的resolve参数不一定真正能达到解析的效果~_~),供继承用protectedsynchronizedClass>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{//…}//findCl
8、ass方法一般被loadClass方法调用去加载指定名称类,供继承用protectedClass>findClass(Stringname)throwsClassNotFoundException{//…}bcincwq2004love@163.com//定义类型,一般在findClass方法中读取到对应字节码后调用,可以看出不可继承(说明:JVM已经实现了对应的具体功能,解析对应的字节码,产生对应的内部数据结构放置到方法区,所以无需覆写,直接调用就可以了)pro
此文档下载收益归作者所有