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

    User java.lang.Class 所有的类都是Class类的对象
    类加载:由.java源文件编译生成.class二进制字节码文件,当运行时,首先Java虚拟机会将本地/网络阐传输.class文件加载到内存当中,那么加载的过程就叫做类加载

    一.类加载的过程
    加载过程:将.class文件通过IO流的方式加载到内存当中
    1.将.class文件字节码内容加载到内存当中
    2.先会将静态数据转换成方法区中的运行的数据结构
    3.在堆内存当中生成一个代表这个类的Class对象,这个Class类的对象就是作为方法区数据访问的入口 Class.forName(com.wdksoft.User);
    链接过程:
    1.验证阶段:验证字节码文件的准确性,包含文件格式,元数据,符号引用,字节码等等
    2.准备阶段:给类中的静态变量分配内存,并赋予初始值
    3.解析阶段:将虚拟机常量池的符号引用替换成字节引用的过程
    初始化过程:初始化过程就会对类中的静态变量初始化为指定的值,执行静态代码块,执行构造器

    使用过程

    卸载过程


    二.类加载器的种类
    1.引导类加载器:负责加载JRE核心类库,jre包下rt.jar,charsets.jar等,C++语言编写,无法直接访问
    2.扩展类加载器ExtClassLoader:负责加载JRE扩展目录ext中的jar包
    3.系统类加载器AppClassLoader:负责加载classPath路径下的类包
    4.自定义类记载器:负责加载用户自定义下的类包
    实现自定义类加载器:extends ClassLoader,重写loadClass方法进行类的加载





    三.类加载机制(重点)
    1.全盘负责委托机制
    当进行类加载的时候,如果手动指定了ClassLoader,那么该类所依赖和引用的类也由这个类加载器进行加载
    User->UserParent
    指定User使用特定的类加载器,那么跟User类有依赖和引用关系的类也用这个类加载器进行加载

    2.双亲委派机制
    指先委托父类加载器寻找目标类,如果父类加载器无法进行类的加载则子类加载器自身处理

    1.沙箱安全机制:自定义的String.class不会被加载,这样可以防止核心API库被随意篡改
    2.避免类重复加载:当附加在其加载了该类是,就没有必要子类加载器也进行加载

    3.如何破坏双亲委派机制
    为什么要破坏双亲委派机制:父加载器需要委托子加载器在其进行加载

    如何破坏:

    1.重写ClassLoad类中的loadClass方法,指定加载哪一个类
    2.手动调用系统类加载器
    Thread.currentThread().getContextClassLoader();
    3.重写findClass

  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/danxun/p/12470410.html
Copyright © 2011-2022 走看看