文档章节

class文件检查器学习记录

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

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

xionghuiCoder ⋅ 2015/09/04 ⋅ 0

Java基础-Java编译详解

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

xjt2016 ⋅ 2016/12/27 ⋅ 0

JAVA高级编程之类加载-反射-动态代理

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

清枫_小天 ⋅ 2016/07/16 ⋅ 0

《JAVA编程思想》学习笔记——第十四章 类型信息

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

lixiaocheng18 ⋅ 2017/03/30 ⋅ 0

Java 类加载与初始化

文章转自 http://www.cnblogs.com/zhguang/p/3257367.html, 该文章中的类加载概念与《java编程思想》概念有所不同。《java编程思想》里类加载包含了该文章的类加载,链接,验证,初始化等过...

iamyangjy ⋅ 2015/11/14 ⋅ 0

从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重...

jeffsui ⋅ 2012/10/31 ⋅ 9

JVM:加载、链接和初始化

JVM要解释Java字节码,就必须对所需的类和接口执行如下3步操作: (1) 加载:JVM在加载类时,会查找该类或该接口的二进制表示,并根据找到的二进制表示(通常是由Java编译器创建的类文件)创建一...

Kerry_Han ⋅ 2014/03/31 ⋅ 0

java 安全沙箱模型

起到第一道安全保障作用的”双亲委派类加载模型” 双亲委派方式的类加载,指的是优先从顶层启动类加载器开始,自顶向下的方式加载类的模型(参见第一条类装载器体系结构)。 这种模型的好处是...

WhiteLeibniz ⋅ 2012/12/27 ⋅ 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 ⋅ 0

Java安全沙箱机制

Java安全模型的前三个部分——类加载体系结构、class文件检验器、Java虚拟机(及语言)的安全特性一 起达到一个共同的目的:保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得它...

墙头草 ⋅ 2011/04/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 4分钟前 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 5分钟前 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 12分钟前 ⋅ 0

Spring Cloud Config

Spring Cloud Config application.yml 和 bootstrap.yml 区别 加载顺序 bootstrap.yml 先加载 application.yml 后加载 bootstrap.yml 用于应用程序上下文的引导阶段。 bootstrap.yml 由父 Sp...

施长成 ⋅ 22分钟前 ⋅ 0

MapReduce V2——YARN调度

一、MapReduce的局限性 1、JobTracker的单点问题 2、TaskTracker的作业信息分配的过于简单,当有资源消耗较大的或者时间较长的Task分配在同一个节点上的时候,容易失败或者等待时间过长 3、作...

cjxcloud ⋅ 23分钟前 ⋅ 0

EOS踩坑--脆弱的数据库

安装EOS我就不在这赘述了,来唠唠EOS踩到的坑,跟着官方文档走,然后到了同步数据的时候,Ctrl+Z结束了之后,再次运行报错 root@ubuntu:~# nodeos -e -p eosio --plugin eosio::chain_api_pl...

开源首席鉴黄师 ⋅ 23分钟前 ⋅ 0

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 39分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 48分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 49分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部