类加载器

1.系统提供三个类加载器

下面是三种类加载器加载类文件的地方:

1) BootstrapClassLoader(启动类加载器)Bootstrap类加载器 – JRE/lib/rt.jar(开发时候用的核心类)

2) ExtensionClassLoader(标准扩展类加载器)Extension类加载器 – JRE/lib/ext或者java.ext.dirs指向的目录(扩展包)

3) AppClassLoader(系统类加载器) Application类加载器 – 加载ClassPath中jar包和class文件

MyClassLoader都是AppClassLoader加载器的子类

4)CustomClassLoader(自定义加载器) 
  属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现。

2.这三个类加载器是树状结构

3.类加载过程:

     一个类A是由一个类加载器加载的,如果类A中使用了类B,类B也是由类A的加载器所加载

4.类加载器的工作原理是基于委托机制的:

  发起者类加载器 去加载类的时候,先委托其给父类加载,如果还有父类加载器,则继续委托上去,直到没有父加载器为止,

   最顶层的类加载器需要真正的去加载指定类,如果在其目录中找不到这个类,继续往下查找,直到发起者类加载器为止。

委托机制的好处是:

    可以让代码更加安全!

     (无论new多少个类实例,内存中只加载一次类文件(字节码文件))

5. 类加载器的顺序 
  1)加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载

  就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。 
  2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。 

  3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null。

在类的加载过程中,静态成员类的对象,会优先加载;而普通成员类的对象则是使用的时候才回去加载。

6.一个web的servlet的加载顺序:

  1)WebappClassLoader(tomcat自定义类加载器):

      加载web/WEB-INF/classes/    类

       加载web/WEB-INF/lib/  *.jar jar包

      WebappClassLoader的设计的目录为了分离服务器中每个web应用,让每个web应用互不干扰

      打破了委托机制,为了保持优先加载当前web应用的所有资源

  2)StandardClassLoader:((tomcat自定义类加载器))加载tomcat/lib/*.jar

      用户加载所有的web用到的jar包或类

  3)AppClassLoader:classpath为空的,失效的,在这里用不到,因为WebappClassLoader已经加载了classpath的类

  4)ExtClassLoader

  5)BoosStrap

原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/9571470.html