标签:
顾名思义,类加载器(class loader)用来把Java 类动态的加载到 Java 虚拟机中。也就是说当程序需要某个类时,类加载器就把这个类的二进行加入到虚拟机中。
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
java.lang.ClassLoader
。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才能生效的原因。
标签:
原文地址:http://www.cnblogs.com/luyanliang/p/5508512.html