深入理解Java虚拟机:Class文件检验器

什么是Class文件检验器?

    Class文件检验器保证装载的class文件内容有正确的内部结构,并且这些class文件相互间协调一致。如果class文件检验器在class文件中发现了问题,它将抛出异常。好的Java编译器不应该产生畸形的class文件,但是Java虚拟机并不知道某个特定的class文件是如何被创建的。因为class文件实质上是一个字节序列,所以虚拟机无法分辨特定的class文件是由正常的Java编译器产生的,还是黑客特制的(黑客可能威胁虚拟机的完整性)。

    所以,所有的Java虚拟机的实现必须有一个class文件检验器,文件检验器可以调用class文件以确保这些定义的类型可以安全的使用。


执行流程

    class文件检验器要进行四趟独立的扫描来完成它的操作。

    第一趟扫描是在类被装载时进行的,在这次扫描中,class文件检验器检查这个class文件的内部结构,以保证它可以被安全地编译。

    第二(数据类型的语义检查)和第三趟(字节码验证)是在连接过程中进行的,在这两次扫描中,class文件检验器确认类型数据遵从Java编程语言的定义,包括校验它所包含的所有字节码的完整性。

    第四趟扫描是在进行动态连接的过程中解析符号引用时进行的,在这次扫描中,class文件检验器确认被引用的类、字段以及方法确实存在。
    在解析时,虚拟机执行两个基本任务

        1)查找被引用的类(如果有必要的话就装载它)。
        2)将符号引用替换为直接引用(例如一个指向类、字段或方法的指针或偏移量)。

    虚拟机必须记住这个直接引用,这样当它再次遇到相同的引用的,它就可以立即使用这个直接引用,而不必花时间再次解析这个符号。当这个引用是非法引用时—–例如,这个类不能被装载,或者这个类的确存在,但是不包含被引用的字段或方法—–Java虚拟机将抛出一个NoSuchMethodError。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值