Java 类装载器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 类装载器相关的知识,希望对你有一定的参考价值。

类装载器

基本概念:

顾名思义,类加载器(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 }

运行结果:

 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 类装载器的主要内容,如果未能解决你的问题,请参考以下文章

类装载器学习

JVM的类装载子系统

类装载器理解

java类加载器?

java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)

Java类的装载过程和静态代码块