zoukankan      html  css  js  c++  java
  • 类加载器

    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

  • 相关阅读:
    C he 指针
    typedef 与 define
    (转)ubuntu中安装man手册查看函数原型
    .9 赫夫曼编码
    .8 AVL树
    PowerDesigner使用技巧
    C#基础
    NET框架设计
    Sql Server 执行计划及Sql查询优化
    SQL SERVER函数浅析
  • 原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/9571470.html
Copyright © 2011-2022 走看看