java类加载器初探

上传人:jiups****uk12 文档编号:40003301 上传时间:2018-05-22 格式:DOCX 页数:10 大小:127.31KB
返回 下载 相关 举报
java类加载器初探_第1页
第1页 / 共10页
java类加载器初探_第2页
第2页 / 共10页
java类加载器初探_第3页
第3页 / 共10页
java类加载器初探_第4页
第4页 / 共10页
java类加载器初探_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《java类加载器初探》由会员分享,可在线阅读,更多相关《java类加载器初探(10页珍藏版)》请在金锄头文库上搜索。

1、 1 / 10学习笔记一:java 类加载器初探包追军众所周知,java是一种天生就具有动态连结能力的技术。Java源程序在编译器处理之后,无论是类的声明还是接口的声明,全部变成一个个小的执行单位(类文件class) ,一旦我们指定一个具有public static void main(String args)方法的类作为起点开始运行后,java虚拟机会找出所有在执行期间需要的执行单位也就是类文件,并将他们载入内存当中(严格的说是载入到JVM中) ,以便调用。尽管本质上是一些类文件,但是在载入内存中后,就成了一个java应用程序。所以,对于java虚拟机来说,每一个类文件其实就是一个动态链接库

2、,只不过它的后缀名不是dll之类的,而是class。正因为这种特性,我们可以在不重新编译其它java源程序的情况下,只修改有问题的java源程序生成class文件后对原来的文件进行替换,等下次java虚拟机重新启动时,这个java应用程序就会载入新的修改的class文件,同样自己的功能也得到了更新。我们都用过tomcat,但是对于它的Hot Deployment(热部署)功能可能没有经过系统的了解。也许你会问tomcat Hot Deployment没听说过,其实你每一次启动tomcat,修改你的jsp或者servlet后,在浏览器里发起一次Http request就显示了你修改后的功能。而实

3、现这么个操作的“幕后帮手”就是tomcat的Hot Deployment。在这段过程中,tomcat没有关闭也没有重启,tomcat做的事情就是重新载入你修改的那个就的servlet替换原来的servlet。那么是什么使tomcat具备了Hot Deployment的能力了呢?是classloader(类加载器) ,当然tomcat的Hot Deployment功能实现还设计的其他的技术。本文将分析JVM中的类加载系统,探讨类加载的原理、体系结构和过程分析。1.类加载基础类加载基础1.1类加载器的请求传递模型类加载器的请求传递模型Bootstrap Class LoaderExtension

4、Class LoaderSystem Class LoaderUser-Defined Class LoaderUser-Defined Class LoaderUser-Defined Class Loader$JAVAHOME/jre/lib/rt.jar$JAVAHOME/jre/lib/ext/*.jar$CLASSPATH2 / 10Bootstrap Class Loader(引导类加载器)不能由java代码实例化。通常它是作为VM本身的一部分实现的。这个类加载器可以从启动的类路径加载核心系统类,通常是位于jre/lib目录下的jar文件,但是能用 Xbootclasspath命令

5、选项修改这个类的路径。Extension Class Loader(扩展类加载器)是Boostrap Class Loader的一个子类。它的主要职责是从扩展目录加载类,通常位于jre/lib/ext目录。System Class Loader(系统类加载器或应用程序类加载器)负责从classpath环境变量指定的路径加载代码。默认情况下,这个类加载器是用户创建的任何类加载器的父类。同样也是ClassLoader.getSystemClassLoader()方法返回的类加载器。1.2类路径命令行类路径命令行命令行命令行解释解释涉及的类加载器涉及的类加载器-Xbootclasspath:设置引导

6、类和资源的搜索路径引导-Xbootclasspath/a:把路径添加到启动类路径的末尾引导-Xbootclasspath/p:把路径添加到启动类路径的前面引导-Djava.ext.dirs=指定扩展类和资源的搜索路径扩展-cp or classpath设置应用程序类和资源的搜索路径系统-Djava.class.path=设置应用程序类和资源的搜索路径系统2.类加载过程类加载过程类的加载分为三个过程:加载、链接和初始化。加载 字节码验证类准备解析初始化链接链接把字节码从 class 加载到 jvm给类中的变量赋初 始值确保 class 格式正确开辟内存空间加载类所引用的类3 / 10类加载:类加

7、载:找到必要的类(通过查找每个类路径)并加载字节码。在jvm中,加载过程为类对象提供了非常基本的内存结构。在这一过程不对方法、字段和引用的其他类进行处理。也就是说类还不能使用。链接:链接:字节码验证:类加载器对类的字节码进行检测,以确保格式正确、行为正确。类准备:准备代表每个类中定义的字段、方法和实现接口所必须的数据结构。解析:类加载器加载类所有引用的其他所有类。初始化:初始化:类中包含的静态初始化器被执行,静态字段被初始化为默认值。类加载器首先判断要求加载的类是否与过去加载的类相同。如果相同,就返回上次返回的类(即保存在缓存中的类) 。如果不是,就把加载类的机会交给父类。这两步递归以深度优先

8、的方式重复。如果父类返回null(或抛出ClassNotFoundException) ,那么类加载器就会在自己的路径中寻找类的源。也就是说,类加载器在缓存(catch) 、父类(parent) 、自己(self)这三个位置查找类。命令行:java .class找到 jre找到 jvm.dll启动 jvm 并初始化加载 System Class Loader加载 Extension Class Loader产生 Bootstrap Class Loader3.java的类加载方式的类加载方式java的类加载分为隐式和显式两种,隐式的类加载其实我们早就用过了,用new关键字来实例化一个对象时jv

9、m就会自动把我们所需的类加载进去。显式又分为两种一种是使用java.lang.class里的forName()方法,另一种是使用java.lang.classLoader里的loadClass方法。4 / 10java 类加载隐式显式使用 new 关键字使用 java.lang.class 中 的 forName()方法使用 java.lang.classLoader 中 的 loadClass 方法4.类加载实例分析类加载实例分析下面我们通过一个实例来验证一下java类加载器的工作原理。Addnews.javapublic class Addnews public void info() S

10、ystem.out.println(“Using Addnews“); Delnews.javapublic class Delnews public void info() System.out.println(“Using Delnews“); Test.javapublic class Test public static void main(String args) Addnews a = new Addnews(); a.info(); Delnews d = new Delnews(); d.info(); 对Test.java进行编译,生产Test.class、Addnews.c

11、lass和Delnews.class三个文件cmd进入命令行D:test(我这里将这个目录作为测试目录,下文都是在D:test下进行)键入命令:java verbose:class Test我们可以看到以下信息:(信息比较多,截图截不全,只好摘录出来主要的)Opened C:Program FilesJavajre1.6.0_07librt.jar5 / 10Loaded java.nio.charset.Charset$3 from C:Program FilesJavajre1.6.0_07librt.jarLoaded Test from file:/D:/test/Loaded Add

12、news from file:/D:/test/Using AddnewsLoaded Delnews from file:/D:/test/Using Delnews现在对Test.java文件进行修改,改为Test.javapublic class Test public static void main(String args) Addnews a = new Addnews(); a.info(); Delnews d; 这时编译执行命令java verbose:class Test后输出信息如下:Opened C:Program FilesJavajre1.6.0_07librt.j

13、arLoaded java.nio.charset.Charset$3 from C:Program FilesJavajre1.6.0_07librt.jarLoaded Test from file:/D:/test/Loaded Addnews from file:/D:/test/Using Addnews这说明了在java类加载器中,只有实例化后才会被加载。现在再对Test.java文件进行修改,改为Test.javapublic class Test public static void main(String args) Delnews d = new Delnews(); d.

14、info(); Addnews a = new Addnews(); a.info(); 我们再执行一遍,信息变为:Opened C:Program FilesJavajre1.6.0_07librt.jarLoaded java.nio.charset.Charset$3 from C:Program FilesJavajre1.6.0_07librt.jar6 / 10Loaded Test from file:/D:/test/Loaded Delnews from file:/D:/test/Using DelnewsLoaded Addnews from file:/D:/test/

15、Using AddnewsAddnews和Delnews的顺序发生了变化,这个说明了什么问题呢?我们推断java类加载器按需加载,也就是用到了才加载。到底这个推断是否正确呢?我们再修改Test.java文件Test.javapublic class Test public static void main(String args) if(args0.equals(“Addnews“) Addnews a = new Addnews(); a.info(); else if(args1.equals(“Delnews“) Delnews d = new Delnews(); d.info();

16、编译后我们执行java verbose:class Test Addnews此时信息变为了:Opened C:Program FilesJavajre1.6.0_07librt.jarLoaded java.nio.charset.Charset$3 from C:Program FilesJavajre1.6.0_07librt.jarLoaded Test from file:/D:/test/Loaded Addnews from file:/D:/test/Using Addnews改执行java verbose:class Test Delnews此时信息变为了:Opened C:Program FilesJavajre1.6.0_07librt.ja

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号