码迷,mamicode.com
首页 > 编程语言 > 详细

Java 类装载器

时间:2016-05-19 15:06:12      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

类装载器

基本概念:

顾名思义,类加载器(class loader)用来把Java 类动态的加载到 Java 虚拟机中。也就是说当程序需要某个类时,类加载器就把这个类的二进行加入到虚拟机中。

类加载器的树状组织结构

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

技术分享     技术分享

除了引导类加载器之外,所有的类加载器都有一个父类加载器。开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

代码查看树型结构:

 1 public class ClassLoaderTree {
 2 
 3     public static void main(String[] args) {
 4         ClassLoader loader = ClassLoaderTree.class.getClassLoader(); 
 5         while (loader != null) { 
 6             System.out.println(loader.toString()); 
 7             loader = loader.getParent(); 
 8         } 
 9     }
10 }

运行结果:

sun.misc.Launcher$AppClassLoader@73d16e93
sun.misc.Launcher$ExtClassLoader@15db9742

 ClassLoaderTree 即为系统加载器,是AppClassLoader类的实例类。

 注:没有输入bootstrap类加载器,是因为它是系统内部由c语言写的,所以有Java程序中获取不到。

加载类的过程

classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。

Java 类装载器

标签:

原文地址:http://www.cnblogs.com/luyanliang/p/5508512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!