• 类加载机制


    简介:

      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.解析阶段:将虚拟机常量池的符号引用替换成字节引用的过程
        初始化过程:初始化过程就会对类中的静态变量初始化为指定的值,执行静态代码块,执行构造器
        使用过程
        卸载过程

    复制代码
    public class ClassLoaderTest {
        private static Integer i=50;
    
        static {
            System.out.println("静态代码块");
            i=70;
        }
    
        public ClassLoaderTest(){
            System.out.println(i);
            System.out.println("类中构造函数");
        }
    
        public static void main(String[] args) {
            ClassLoaderTest test = new ClassLoaderTest();
        }
    }
    复制代码

      二.类加载器的种类

        1.引导类加载器:负责加载JRE核心类库,jre包下rt.jar,charsets.jar等,C++语言编写,无法直接访问


        2.扩展类加载器ExtClassLoader:负责加载JRE扩展目录ext中的jar包

        3.系统类加载器AppClassLoader:负责加载classPath路径下的类包

        4.自定义类记载器:负责加载用户自定义下的类包 
          实现自定义类加载器:extends ClassLoader,重写loadClass方法进行类的加载

    复制代码
    public class Test {
        //获取String类的类加载器
        System.out.println(String.class.getClassLoader());
    System. out . println(DESKeyFactory. class. getClassLoader() . getClass() . getName());
    //获取当前类的类加载器
    System. out . println(Test.class. getClassLoader(). getClass() . getName());
    //获取系统类加载器
    System. out . println(ClassLoader . getSys temClassLoader() . getclass() . getName();
    
    }
    复制代码

      三.类加载机制

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

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

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

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

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

      四.监控类加载过程

        在当前启动类当中加入-verbose:class参数,启动则可以看到整个类加载的过程

      五.热部署

        时时检测类,如果类发生更改则自动进行重新编译,编译之后重新加载该类

  • 相关阅读:
    Windows内核对象
    FreeWriting_1
    FreeWriting_2
    【整理】技术文章集锦
    【转】英语吵架一百句
    像 IDE 一样使用 vim
    统治世界的十大算法
    AnimationSet动画集合类的使用
    帮你解答adb是什么,adb有什么用
    SharedPreferences的简单使用
  • 原文地址:https://www.cnblogs.com/tinghao/p/12482708.html
Copyright © 2020-2023  润新知