1.为什么要有类加载器

java文件编译后产生的,class文件不是可执行文件,需要通过类加载器将.class加载到虚拟机中。

2.java类加载器有多少

Bootstrap–>ExtClassLoader->AppClassLoader->自定义的ClassLoader。

  • BootStrap ClassLoader:称为启动类加载器,C++实现的,是Java类加载层次中最顶层的类加载器(JVM启动后初始化的),负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等;
  • ExtensionClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。该加载器是有java实现的,由Bootstrploader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader;
  • AppClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。

3.类加载器的委托机制

先委托给父加载器去加载,一直委托到最顶层Bootstrap,Bootstrap去查找对应的类,没找到则委托ExtClassLoader去查找,一直到最底层的ClassLoader。

4.自定义类加载器

继承ClassLoader,重写findClass方法即可。

5.应用场景

热部署、tomcat为每个应用创建了不同的类加载器隔离应用(tomcat的类加载器破坏了双亲委派机制,tomcat是从自定义的类加载器往Bootstrap查找)、class文件解密(假定传输方对class为了安全进行了加密,接收方需要自定义加载器进行解密,然后创建响应的对象使用)、java Applet(从远程下载class文件)、应用中需要用到不同版本的jar。

可以参考下面的这些链接,有详细的说明和例子。
参考:自定义类加载器:从网上加载class到内存、实例化调用其中的方法JVM高级特性与实践(九):类加载器 与 双亲委派模式(自定义类加载器源码探究ClassLoader)深入探讨 Java 类加载器java类加载器和双亲委派模型