java ClassLoader工作机制

转载 2016年05月31日 22:38:30

原文: http://longdick.iteye.com/blog/442213

/**

*  转载请注明作者longdick    http://longdick.iteye.com

*

*/

 

Java应用环境中不同的class分别由不同的ClassLoader负责加载。
一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:


Bootstrap ClassLoader     负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
Extension ClassLoader      负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
App ClassLoader           负责加载当前java应用的classpath中的所有类。

 

其中Bootstrap ClassLoader是JVM级别的,由C++撰写;Extension ClassLoader、App ClassLoader都是java类,都继承自URLClassLoader超类。
Bootstrap ClassLoader由JVM启动,然后初始化sun.misc.Launcher ,sun.misc.Launcher初始化Extension ClassLoader、App ClassLoader。

下图是ClassLoader的加载类流程图,以加载一个类的过程类示例说明整个ClassLoader的过程。

 



 Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader三者的关系如下:

Bootstrap ClassLoader是Extension ClassLoader的parent,Extension ClassLoader是App ClassLoader的parent。

但是这并不是继承关系,只是语义上的定义,基本上,每一个ClassLoader实现,都有一个Parent ClassLoader。

 

可以通过ClassLoader的getParent方法得到当前ClassLoader的parent。Bootstrap ClassLoader比较特殊,因为它不是java class所以Extension ClassLoader的getParent方法返回的是NULL。

 

了解了ClassLoader的原理和流程以后,我们可以试试自定义ClassLoader。

 

关于自定义ClassLoader:

 

由于一些特殊的需求,我们可能需要定制ClassLoader的加载行为,这时候就需要自定义ClassLoader了.

自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。

主要可以扩展的方法有:

findClass          定义查找Class的方式

defineClass       将类文件字节码加载为jvm中的class

findResource    定义查找资源的方式

 

如果嫌麻烦的话,我们可以直接使用或继承已有的ClassLoader实现,比如

 

  • java.net.URLClassLoader
  • java.security.SecureClassLoader
  • java.rmi.server.RMIClassLoader
  • sun.applet.AppletClassLoader

Extension ClassLoader 和 App ClassLoader都是java.net.URLClassLoader的子类。

这个是URLClassLoader的构造方法:

 

public URLClassLoader(URL[] urls, ClassLoader parent)

public URLClassLoader(URL[] urls)

 

urls参数是需要加载的ClassPath url数组,可以指定parent ClassLoader,不指定的话默认以当前调用类的ClassLoader为parent。

 

代码示例:


    ClassLoader classLoader = new URLClassLoader(urls);  
    Thread.currentThread().setContextClassLoader(classLoader);  
    Class clazz=classLoader.loadClass("com.company.MyClass");//使用loadClass方法加载class,这个class是在urls参数指定的classpath下边。  
      
    Method taskMethod = clazz.getMethod("doTask", String.class, String.class);//然后我们就可以用反射做些事情了  
    taskMethod.invoke(clazz.newInstance(),"hello","world"); 

 

由于classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。

所以,当我们自定义的classloader加载成功了com.company.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。

 

自定义ClassLoader在某些应用场景还是比较适用,特别是需要灵活地动态加载class的时候。

下面这篇文章列出了其中一种自定义ClassLoader的应用场景,有兴趣的同学可以参考下:

http://longdick.iteye.com/blog/332580


java 深入分析ClassLoader工作机制

ClassLoader顾名思义就是类加载器,负责将Class加载到JVM中,它就好比开会时 门口的接待员,负责给进入会场的嘉宾发放入会证明,入会的嘉宾分为VIP会员、黄金会 员、白金会员和普通会员等。...
  • qilixiang012
  • qilixiang012
  • 2014年11月02日 16:38
  • 1224

深入分析ClassLoader工作机制

//转载自【深入理解java web技术内幕】 ClassLoader类结构分析: 我们经常会用到或者扩展ClassLoader,主要会用到一下几个方法,以及他们的重载方法。 defineCla...
  • u010585120
  • u010585120
  • 2016年10月09日 16:57
  • 266

深入分析ClassLoader工作机制

ClassLoader 较为深入分析。from 加载CLASS到JVM中,审查每个类应该由谁加载,父优先的等级加载机制。加载机制ClassLoader类结构分析ClassLoader抽象类,有很多子类...
  • Newpidian
  • Newpidian
  • 2016年12月10日 00:26
  • 2697

一看你就懂,超详细java中的ClassLoader详解

ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLo...
  • briblue
  • briblue
  • 2017年02月10日 19:26
  • 39968

深度分析 Java 的 ClassLoader 机制(源码级别)

Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的l...
  • Jason_huzhe
  • Jason_huzhe
  • 2016年05月05日 09:39
  • 626

深度分析Java的ClassLoader机制(源码级别)

http://www.hollischuang.com/archives/199 写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完...
  • zdy0_2004
  • zdy0_2004
  • 2015年12月14日 17:12
  • 1650

JAVA反射机制深入学习(三)ClassLoader类装载器介绍

接下来介绍下JAVA中非常重要的一个类ClassLoader(类装载器) 类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。主要工作由ClassLoader及其子类负责,Clas...
  • icarus_wang
  • icarus_wang
  • 2016年05月29日 12:55
  • 863

java ClassLoader类解析-双亲委托机制

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspo...
  • wangyang1354
  • wangyang1354
  • 2015年10月27日 14:43
  • 6982

一看你就懂,超详细java中的ClassLoader详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[-] Class文件的认识你还记得java环境变量吗 JAVA_HOMEPATHCLASSPATH环境变量的设置与查看 J...
  • andyzhaojianhui
  • andyzhaojianhui
  • 2017年06月01日 11:05
  • 547

深入分析java web 技术内幕_笔记_六

深入分析classLoader工作机制 Classloader负责将Class加载到JVM中,并且确定由那个ClassLoader来加载(父优先的等级加载机制)。还有一个任务就是将Class字节码...
  • dac55300424
  • dac55300424
  • 2014年01月24日 15:56
  • 789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java ClassLoader工作机制
举报原因:
原因补充:

(最多只允许输入30个字)