类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口:
类加载器的层次结构(树状结构):
- 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库),是用C来实现的,并不继承自 java.lang.ClassLoader;
- 扩展类加载器(extensions class loader):用来加载 Java 的扩展库,Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java类,由ExtClassLoader实现;
- 应用程序类加载器(application class loader):它根据 Java 应用的类路径来加载 Java 类,一般来说,Java 应用的类都是由它来完成加载的,由AppClassLoader实现;
- 自定义类加载器: 开发人员可以通过继承 java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。
注意:类加载器加载类的时候是线程安全的
双亲委托机制:
- 就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次追溯,直到最高的爷爷辈的,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
- 双亲委托机制是为了保证 Java 核心库的类型安全,这种机制就保证不会出现用户自己能定义java.lang.Object类的情况。
- 类加载器除了用于加载类,也是安全的最基本的屏障。
- 双亲委托机制是代理模式的一种,但并不是所有的类加载器都采用双亲委托机制:tomcat服务器类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器,这与一般类加载器的顺序是相反的。