类的加载机制

来源:互联网 发布:推荐几本好看的书 知乎 编辑:程序博客网 时间:2024/06/08 07:25

jvm中有多个类加载器,每个类加载器负责加载指定位置的类。

      Java源代码(.java)在经过java编译器编译之后生成java字节码(.class),类加载器负责加载java字节码到jvm中,并转换成java.lang.Class类的一个实例

例:bootstrap类加载器(原生代码实现,c++)负责加载jre/lib/rt.jar中的类,extclassloader负责加载jre/lib/ext/*.jar中的类,appclassloader负责加载classpath指定位置的类。

 

获取系统类加载器:ClassLoader中的getSystemClassLoader()方法

jvm加载第一个类时,由当前线程的上下文类加载器加载(默认为系统类加载器),如果类A中引用了类B,使用加载类A的加载器加载B(调用加载器的load方法)

线程上下文类加载器:每个线程对象有一个线程上下文类加载器对象(默认为系统类加载器)

        

双亲委派模型:             -->运行期加载

      如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求委派给父类加载器完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都传送到启动类加载器中,只有当父加载器无法完成加载请求时,子加载器才会尝试自己去加载。

     比较两个类是否”相等”,只有在这两个类是由同一个类加载加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,只要加载它们的类加载器不同,那这两个类必定不相等。

 

类加载过程:1.加载 JVM加载类文件的二进制字节流到方法区,在堆中生成一个

java.lang.Class对象,作为方法区这些数据的访问入口

              2.验证  和加载交叉进行,确保类文件的二进制字节流符合要

求。(非法类型转换、继承不允许继承的类等)

              3.准备    为类变量分配内存,并设置默认初始值

              4.解析    将符号引用解析为直接引用

              5.初始化         

原创粉丝点击