类的加载机制

什么是类的加载机制?
为什么要有这个行为?
类加载的结果是什么?

我们知道,Java是一种纯面向对象的语言,在Java里,万物皆对象。而对象,是一个类的实例,所以在Java里,不仅依赖对象,更是依赖于类。
Java里有许多已经封装好的类库,我们使用类库中的类时,“轻而易举”、“没有丝毫阻力”。那么当我们自己定义一个类时,类加载机制就是以某种特定的行为让我们去使用某个类们自己定义的类。

所谓类的加载机制,就是将描述类的数据信息从class文件中加载到内存里,然后进行数据验证、解析和初始化。

所谓class文件,也就是 .java 经过编译产生的 .class文件。这个 .class 文件会通过类的加载器,生成一个class对象。
在这里插入图片描述

每一个类只会被加载一次,产生一个class对象

这个class对象也是方法区的入口,Java虚拟机的内存划分如下:
在这里插入图片描述

上面这个过程,也就是类加载的第一步:加载。
类的加载过程为:加载、连接、初始化

类的加载,是通过一种名叫双亲委派模型的机制进行加载的。

说到这里,JDK提供了三种类加载器,分别是
1)Bootstrap ClassLoader(启动类加载器) 路径:JVAVA_HOME/jre/lib/.jar
2)ExtClassLoader(扩展类加载器) 路径:JAVA_HOME/jre/lib/ext/.jar
3)AppClassLoader(应用程序类扩展器) 路径:加载自定义的类和CLASSPATH路径下的类

我刚才说过,我们要使用类库中的类是很“轻而易举”的,因为它们是由最顶级的类加载器 Bootstrap ClassLoader 加载的,比如String、System、Scanner等类;同时也是原以双亲委派模型的存在。

那什么是双亲委派模型呢?

首先要了解,Bootstrap ClassLoader是最顶级的类加载器,接下来是扩展类加载器,也就是ExtClassLoader,其次才是AppClassLoader。
在进行类的加载时,先判断该类是否被加载过,如果已经被加载过,则返回这个类;如果没有被加载过,向上走(如下图),也就是委托其父类对这个类进行尝试加载,继续检查这个类的加载情况,直至委托到最顶级的父类Bootstrap ClassLoader;如果这个类也没有被Bootstrap ClassLoader加载过,开始由Bootstrap ClassLoader至其子类依次查找,检查这个类是否可以被加载、在没在自己的加载范围里,可以加载,就返回这个类,不可以,就抛出一个异常–>ClassNotFoundException。
在这里插入图片描述
双亲委派模型的优点:
1)安全性
避免用户自己编写的类动态替换 Java 的一些核心类。如果不采用双亲委派模型的加载方式进行类的加载工作,那我们就可以随时使用自定义的类来动态替代 Java 核心 API 中定义的类。例如:如果黑客将“病毒代码”植入到自定义的 String 类当中,随后类加载器将自定义的 String 类加载到 JVM 上,那么此时就会对 JVM 产生意想不到“病毒攻击”。而双亲委派的这种加载方式就可以避免这种情况,因为 String 类已经在启动时就被引导类加载器进行了加载。
2)避免类的重复加载
因为 JVM 判定两个类是否是同一个类,不仅仅根据类名是否相同进行判定,还需要判断加载该类的类加载器是否是同一个类加载器,相同的 class 文件被不同的类加载器加载得到的结果就是两个不同的类。

至此,类的加载初步完成。

第二部分,连接:验证、准备、解析
1)验证:验证字节码文件中的二进制字符流是否符合规范,这个 .class 文件是否能正确使用。
2)准备:给类变量在方法区中开辟内存,赋类型的初始值
3)解析:虚拟机将常量池内的符号引用替换为直接引用的过程

第三部分:初始化
给类变量的赋值操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值