• ClassLoader


    从上图我们就可以看出类加载器之间的父子关系(注意不是类的集继承关系)和管辖范围。

    (1)BootStrap是最顶层的类加载器,它是由C++编写而成,并且已经内嵌到JVM中了,主要用来读取Java的核心类库JRE/lib/rt.jar

    (2)ExtensionClassLoader是是用来读取Java的扩展类库,读取JRE/lib/ext/*.jar

    (3)AppClassLoader是用来读取CLASSPATH指定的所有jar包或目录的类文件

    (4)CustomClassLoader是用户自定义编写的,它用来读取指定类文件

    JVM类加载机制:全盘负责委托机制

    全盘负责:当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;
    委托机制:先让parent(父)类加载器(而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。

    Cache机制:如果cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。

    每个ClassLoader加载Class的过程是:
    1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
    2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
    3.请求parent classloader载入,如果成功到8,不成功到5
    4.请求jvm从bootstrap classloader中载入,如果成功到8
    5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
    6.从文件中载入Class,到8.
    7.抛出ClassNotFoundException.
    8.返回Class.
    其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

    在没有setContextClassLoader情况下,contextClassLoader是AppClassLoader
    也就是说,Class.forName("foo")的类加载器是AppClassloader

    详看http://developer.51cto.com/art/201103/249613.htm的一道例题

  • 相关阅读:
    jquery实现京东轮播图的简单写法
    prop方法实现全选效果
    jquery实现点击小图实现大图的案例
    jquery实现淘宝精品图片切换
    html+css实现下拉菜单效果
    jquery对象和DOM对象的联系及转化
    【学习】012 垃圾回收机制算法分析
    【学习】011 JVM参数调优配置
    【学习】010 Netty异步通信框架
    【学习】009 NIO编程
  • 原文地址:https://www.cnblogs.com/children/p/2400472.html
Copyright © 2020-2023  润新知