文档章节

class文件检查器学习记录

 一天两天的天
发布于 2016/11/25 10:52
字数 763
阅读 6
收藏 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
作品 0
江北
私信 提问
java安全沙箱(二)之.class文件检验器

java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器...

xionghuiCoder
2015/09/04
0
0
老司机带你深入浅出Java反射

反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,...

小刀爱编程
11/07
0
0
Java基础-Java编译详解

Java基础-Java编译详解 Java源代码编译过程 Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过...

xjt2016
2016/12/27
30
0
JAVA高级编程之类加载-反射-动态代理

Java高级编程之类加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将class文件读入内存,并为之创建一个...

清枫_小天
2016/07/16
0
0
《JAVA编程思想》学习笔记——第十四章 类型信息

运行时类型信息使得你可以在程序运行时发现和使用类型信息。 主要有两种方式:一种是"传统的"RTTI, 它假定我们在编译时已经知道了所有的类型;另一种是"反射"机制,它允许我们在运行时发现和使...

lixiaocheng18
2017/03/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Dubbo下一站:Apache顶级项目

摘要: 导读: 近日,在Apache Dubbo开发者沙龙杭州站的活动中,阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。...

阿里云云栖社区
7分钟前
0
0
Vim中快捷键命令介绍

map命令简介 map是一个映射命令,将常用的很长的命令映射到一个新的功能键上。map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。Vim中有五种映射存在: 用于普通模式:...

陶小陶
11分钟前
0
0
结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景: 数据库连接信息 限流阈值和降级开关 流量的动态调度 上一篇:Nacos帮我解决了什么问题? 数据...

阿里云官方博客
13分钟前
0
0
Docker | 采用镜像alpine缺少时区解决方法

加入: RUN apk --update add tzdata当然也可以安装其他的如 procps, php 等

云迹
13分钟前
0
0
在Python中调用Java扩展包HanLP测试记录

最近在研究中文分词及自然语言相关的内容,关注到JAVA环境下的HanLP,HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义...

左手的倒影
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部