类装载器
基本概念:
顾名思义,类加载器(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 }
运行结果:
[email protected] [email protected]
ClassLoaderTree 即为系统加载器,是AppClassLoader类的实例类。
注:没有输入bootstrap类加载器,是因为它是系统内部由c语言写的,所以有Java程序中获取不到。
加载类的过程
classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。
时间: 2024-10-27 13:53:04