关于Java 加载类

来源:互联网 发布:知了为什么是这个知 编辑:程序博客网 时间:2024/06/06 01:16

一。Java 有三大加载器 


        根类加载器  boostrap     扩展类加载器  extention  系统加载器   APP


        根类主要是为了 加载jvm初始化一些必须的东西;

       扩展类只要是 jdk/jre/lib/ext/中的扩展类

     系统加载器就是java项目中classpath中的类


   加载类原则是,获取当前类的加载器(委托加载器),自上而下去 加载器 去加载   根类--> 扩展类--> 系统加载器 --> 自定义加载器(如果有的话)

   这个流程中随便哪一级查找到需要加载的类,就会返回该类的实例

   如果没有找到就会  继续用委托加载器 加载类的  加载器再加载一次,如果还是没有找到  就会 报 clssNotFundException 


 自定义的类加载器要继承 Java.lang.ClassLoad 并重写 findClass方法



  

 类的加载分为  :

  1.加载    2.连接   3.初始化


   加载:  找到类进行加载到jvm 中,以二进制流的形式放到jvm的方法区中

  连接:   

         1.验证   :格式检查,语义检查,字节码检查,验证符号引用是否存在直接引用

         2:准备 : 就是给静态变量赋值,初始化的值   比如  int  赋值=0   long =0l  .......

        3. 解析:      将符号引用转为直接引用  ;


初始化:对类的静态变量进行赋值的操作

  首先是 父级的静态代码块 --自己的静态代码块 --父级的成员变量赋值 --自己的成员变量赋值 --父级的构造方法-自己的构造方法


  Class.form  和  loadClass.classLoad 都可以获取一个类的class

  但是class.form会初始化一个类

  而 loadClass.classLoad ,只是加载一个类,并不会去连接和初始化




原创粉丝点击