class文件检查器学习记录
class文件检查器学习记录
一天两天的天 发表于11个月前
class文件检查器学习记录
  • 发表于 11个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

java文件编译成class文件,在编译期 jvm进行了文件检查

1,结构检查;扫描class文件是不是一个符合虚拟机规范的class文件结构,如:模数,版本号等。如果class遵守了class文件规范,那么它将被编译成方法区内(基于实现的)内部数据结构。(第二第三第四次扫描不是针对class文件结构的二进制进行,而是在方法区上进行的)

2,数据类型语义检查;这次检查每个组成部分,确认它们是否是其所属类的实例,它们的结构是否正确,例如方法描述符(它的方法返回类型,参数,参数类型,个数)在class文件中被存储为一个字符串,这个字符串必须符合特定的上下文无关文法。检查器对每个组成部分进行检查的目的之一就是,为了每个方法描述符都是符合特定语法的,格式正确的字符串。另外,class文件检验器检查这个类本身是否符合特定条件,这些都是java编程语言规定的。例如:规定这个类除了Object以外的所有类,都必须有一个超类。在本次检查中,检验器还检查final类有没有被子类化,final方法有没有被覆盖。还要检查常量池条目是否合法,并且常量池的所有索引都必须指向类型的常量池条目。也就是说,class文件检验器在运行时检查一些java语言应该在编译期遵守的强制规定。

3,字节码验证;当成功进行了前两项检查后,本次扫描是虚拟机针对字节流进行分析,这些字节流代表类的方法,也就是存放在方法区里的类型信息。它必须保证局部变量在赋予合适的值前不会被访问,并且类的字段必须被赋予正确的值和类型。类的方法被调用时传入的参数的正确性等。当整个检验过程完成后,他就能保证这个字节流能够安全的运行。(在1,2,3项检查中,class文件检验器将保证class文件的结构合理性,符合java编程语言的规范,并且包含的字节码都能被虚拟机安全的执行,如果有错,将抛出错误)

4,符号引用验证;本次检查,虚拟机会追踪那些引用-从被验证的class文件到被引用的class文件,以确保该引用的正确性。因为本次检查会检查到本class以外的其他类,所以本次检查还涉及到类的装载(java类是延迟加载)如果该引用不能被正确装载,将抛出NoClassDefFoundError错误

                                                                                                                 摘自《深入java虚拟机》第二版

共有 人打赏支持
粉丝 0
博文 1
码字总数 763
×
一天两天的天
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: