美文网首页
10.10类加载器

10.10类加载器

作者: 205蚁 | 来源:发表于2018-11-18 17:01 被阅读0次

    java高级-类加载器

    1.classloader
    程序不会一次性加载所有的.class文件,.class文件有入口方法。而是根据程序需要根据java的加载机制动态的加载某一个.class文件到内存中

    1.什么是类加载器
        ClassLoader就是用来动态加载class文件到内存当中使用
    2.类加载类型
        BootStrap ClassLoader;启动类的加载器,负责加载放在jdk一个叫li目录下的文件,能被虚拟机识别的一个类, 这个类不继承ClassLoader类,它的底层是c++编写的
        Extension ClassLoader:扩展加载器,主要是负责加载jia(还是jin)目录下的ext的目录,可以直接使用这个扩展类加载器
        App ClassLoader:应用程序加载器, 负责加载应用用户路径下所指定的类,所以可以直接使用这个类加载器
        
        第二个分类(站在java虚拟机的角度)
        1.启动类加载器
            BootStrap ClassLoader,c++实现,属于虚拟机内的一部分
            所有其他的类加载器,java实现,独立于虚拟机之外,继承ClassLoader,这些加载器需要启动类加载器 加载完成之后,才能加载其他的类
    3.双亲委托模型
        图:
        他们之间的父子关系并不是通过继承来实现的,而是通过组合关系来复用 加载器中的代码
        
        工作流程:比如说 有一个类加载器收到了要加载java的.classw文件要求,它首先不会自己的尝试加载这个类,而是请求委托给父加载器去完成,所有的加载请求都会传递到顶层的启动类加载器中,只有类加载器在它的搜索范围内没有找到所需要的类时,它无法完成加载,这时 它的子加载器才会尝试去加载。
        
        使用双亲委托模型它能组织类加载器之间的关系,它有一个明显的好处,java类随着类加载器一起具备了一种带层次的关系,这对于保护程序的稳定性非常重要。
        
    4.类加载的过程
        图:
            7个阶段
            加载、验证、准备、解析、初始化、使用、卸载
            
            加载、验证、准备、初始化这四个阶段是确定的,而解析不是,它在某些情况下可以在初始化阶段之后来开始,这是为了能支持java语言的动态绑定,
            
            使用、卸载 是在所有顺序定完了之后再执行
            
            静态绑定
            动态绑定
        第一步:加载
            1.通过一个类的全限定名来获取其定义的二进制字节流
            2.将这个字节流所代表的静态存储结构转化为运行时的数据结构
            3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
            
            既可以使用系统加载器加载,也可以自定义加载器加载
            
        第二部:验证  
            1.为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求
            2.文件格式的验证、元数据的验证、字节码验证和符号引用验证
        第三部:准备
            1.对基本数据类型。如果不显示的赋值,会赋默认值
            2.对于同时被static 和final修饰的常量,必须显示的为其赋值,否则编译不通过
                    只被final修饰的变量,可以在类初始化时赋值,不会被默认赋值
            3.对于引用数据类型 reference,默认值null
            4.在数据初始化时,如果没有赋值, 默认数据里头的值是0
            
        第四部:解析
            解析阶段是虚拟机将常量池中的符号转化为直接引用的过程
            
            图:
                本类-》接口-》父接口-》。。。--》父类-》祖父类-》。。。
                类解析、接口解析、类中方法解析、接口中方法解析
            
            1.类和接口的解析
                首先判断锁转换的直接引用 是数组类型,还是普通对象类型引用,从而进行不同的解析
            2.字段解析
                肯定会在本类中查找,是否包含简单名称,字段描述都符合的字段,如果有,则查找结束,如果没有,按照继承关系从上往下一次查找
            3.类方法解析。类方法解析的搜索步骤和字段搜索差不多
                判断该方法是类,还是接口的方法。对类的方法的匹配顺序,是先搜索父类,再搜索接口
            4.接口方法解析
                递归向上搜索接口
            5.初始化
                初始化阶段是执行类构造器 方法的过程
    

    相关文章

      网友评论

          本文标题:10.10类加载器

          本文链接:https://www.haomeiwen.com/subject/gxpgfqtx.html