类的加载过程

java虚拟机一般使用Java类的流程:
首先将开发者编写的java源代码(.java文件)编译成java字节码文件(.class文件),然后类加载器会读取字节码文件,并转换成java.lang.class对象。java提供的类加载器绝大对数继承于ClassLoader类,他们被用来加载不同的字节码文件。

java类的加载过程:

一、.加载:.java—>.class文件*
1.通过类的全限定名来获取此类的二进制字节流(通过javac解释器)
此过程依靠类的加载器完成:加载器只用于类的加载动作。任意一个类,都需要由加载它的加载器以及类本身来确定他在jvm中唯一性。比较两个类是否相等,前提是这两个类的类加载器相等,否则,即使两个类来源于同一个class文件,只要类加载器不等,他们就必定不相等。
三种类加载器:
(1)Boostrap ClassLoader(启动类加载器/根加载器/引导类加载器):主要加载JAVA_HOME/jre/lib路径下的jar包,该目录下的所有jar包都是运行jvm所必需的包。
(2)ExtClassLoader:主要加载java核心扩展类,即JAVA_HOME/jre/lib/ext目录下的jar包。
(3)AppClassLoader:主要加载的是开发者在应用程序中编写的类,即CLASSPATH下的所有jar包。
类加载器之间采用
双亲委派模型
的加载方式进行类加载。
双亲委派模型工作过程:
(1)当前类加载器在自己已经加载过的类中查询是否已经加载过该类,如果已经加载返回与拿来已经加载过的类。
(2)如果当前类加载器没有加载过该类,则委托该类加载器的父类去加载。父类 加载器也会采取同样的策略,查看自己是否加载过这个类,有就返回,没有就委托父类去加载,直到委托到启动类加载器。
(3)如果启动类加载器加载失败,就会让扩展类加载器尝试加载,继续失败则会使用AppClassLoader来加载,继续失败就会抛出一个ClassNotFoundException异常;
如图所示:
在这里插入图片描述
使用双亲委派模型优点
(1)保证一个类只被加载一次‘
(2)安全。比如:黑客自定义一个java.lang.String类,该String类具有系统的String类一样的功能,只是在某个函数稍作修改。比如equals函数,这个函数经常使用,如果在这这个函数中,黑客加入一些“病毒代码”。并且通过自定义类加载器加入到JVM中。此时,如果没有双亲委派模型,那么JVM就可能误以为黑客自定义的java.lang.String类是系统的String类,导致“病毒代码”被执行。
而有了双亲委派模型,黑客自定义的java.lang.String类永远都不会被加载进内存。因为首先是最顶端的类加载器加载系统的java.lang.String类,最终自定义的类加载器无法加载java.lang.String类。
2.将字节流中所代表的静态存储结构转化成方法区的运行时数据结构
3.将字节流所代表的表这个类的java.lang.Class对象,作为这个类的各种数据的访问入口。
二、连接:(解析,验证,准备)
验证:验证加载的数据,是否jvm造成危害
准备:给静态变量赋值
解析:符号引用(代表数据的字符串)转换成直接引用(具体数据)(只针对静态连接)

三、初始化:对静态变量真正的赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值