文档章节

class文件检查器学习记录

 一天两天的天
发布于 2016/11/25 10:52
字数 763
阅读 5
收藏 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编译详解 Java源代码编译过程 Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过...

xjt2016
2016/12/27
30
0
《JAVA编程思想》学习笔记——第十四章 类型信息

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

lixiaocheng18
2017/03/30
0
0
JAVA高级编程之类加载-反射-动态代理

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

清枫_小天
2016/07/16
0
0
osgi学习博客收藏

使用场景:http://www.blogjava.net/BlueDavy/archive/2009/04/29/268227.html 动态化介绍:http://www.blogjava.net/BlueDavy/archive/2009/04/29/268227.html 在Spring DM中使用Annotatio......

卢瑶
2016/08/16
13
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部