实现语言与操作系统的无关性基础仍然是虚拟机和字节码储存格式,jvm不与java及其他任何语言绑定,只和.class文件这种特定的二进制格式绑定, class文件包含jvm的指令集和符号表等其他信息;使用javac可以将java语言编译成.class文件,使用JRuby编译器可以讲JRuby编译成.class文件,jvm并不关心.class的来源是何种语言。
.class字节码命令提供的描述能力比java语言本身还要强大;.class文件是一组以8位字节(64位)为基础的二进制流,中间没有任何分隔符(如逗号,句号,换行等);jvm规定:.class文件采用一种类似c语言结构体的伪结构来储存数据,这种伪结构只有两种数据类型:无符号数和表;
无符号数属于基本的数据类型,以u1,u2,u4,u8来分别表示一个字节,两个字节,四个字节和8个字节的无符号数,无符号数用来描述数字,索引引用,数量值或按照UTF8编码构成字符串数;
表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性的以"_info"结尾,表用于描述有层次关系的复合结构的数据。整个CLASS文件本质上是一张表。
一个字节码文件大楷内容:
在一个class文件中,同一类型的数据前都会有个计数器,通过上图查看各个数据类型所占的长度。
这是一个等待编译的接口:
package org; public interface Demo {}
执行编译后,执行javap -berbose Demo
E:\side1\Smart\src\test\java\org>javap -verbose Demo Warning: Binary file Demo contains org.Demo Classfile /E:/side1/Smart/src/test/java/org/Demo.class Last modified 2014-10-19; size 93 bytes MD5 checksum 43c458c35524acf338255261e9495239 Compiled from "Demo.java" public interface org.Demo SourceFile: "Demo.java" minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT Constant pool: #1 = Class #5 // org/Demo #2 = Class #6 // java/lang/Object #3 = Utf8 SourceFile #4 = Utf8 Demo.java #5 = Utf8 org/Demo #6 = Utf8 java/lang/Object { }
打印了类文件路径、源文件、版本、md5、类文件长度(size)、类型标识和常量池内容;
使用WinHex软件打开这个类文件:
1、魔数和版本
从长度上为93个字符,是将class文件的二进制数组转换为16进制数组,
前4个字节称为魔数(0xCAFEBABE) ,现在很多文件采用魔数来识别文件类型,而不使用扩展名;
第5、6、7、8个字节是版本号,56是次版本号,78(0x0000 0000 67)是主版本号33,查到33对应的是51;
2、常量池
第9、10(0x0000 0000 89)是显示有多少个常量,这里显示的是7个,要减去一个;表示有6个常量,因为常量是从1开始索引而读取时从0开始读取的;
如果是26则表示(2*16+6-1)为37个常量;
常量池存放两种类型的常量:字面值(直接赋值如“ok”,23,literal)、符号引用(接口类的引用、方法的引用、字段?)
第A (11)字节表示该类文件是 是一个什么类型的引用:7 表示是一个类或接口的符号引用;
查看constant_class_info是含有u1,u2字节的,u1表示自己占了一个字节,u2表示后面的2个字节(0xBC)是显示这个calss或接口信息的 ,
0xC的值是5,表示指向常量池中的第#5项,为 #5 = Utf8 org/Demo,如果是类的值是2,#6是object;
0xD的值又是7,同上查6-3,但后面F的值是6,表示一个Object
到0x0000 00010 0,的值是1,查6-3,是constant_utf8_info,查6-6,要占4个字节,length:0A(10),打印的是sourcefile 10个字符,后又为1,值为9打印的是Demo.java
长度为9,后又为1,值为8,打印的是org/Demo长度为8,后有为1,值为10(16),打印java/lang/object长度为16;在74之后即字符t之后接着的2个字符0601表示访问标识符acess_flag,从javap中可以看到: flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
0x0001|0x0200|0x0400 ---> 0x0601 就是这么来的;一般的类为flags: ACC_PUBLIC, ACC_SUPER,为21
相关推荐
class文件结构解析字节码后文件
Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...
我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结构。 1.Demo源码 首先,编写一...
jclasslib,JClullb字节码查看器是一种工具,它可以可视化编译的Java类文件和包含的字节码的所有方面。.zip
使用Java编程语言,对.class文件进行解析,类似于javap -v filename指令的效果,但是没有对attibutes属性进行解析,需要学习的可以下载,程序运行的效果在本人的博客的附录中
解析传输流188或204byte的Ts文件
基于一个dex文件解析程序修改而成,指定要隐藏的方法的sig即可。
Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...
一个解析java class文件的代码
详细介绍ASM框架的API、Class文件结构解析、HotSpot虚拟机类加载源码分析、动态代理与字节码插桩的实现。
该程序完成从XXX.h264编码文件中解析出视频的基本单元NALU,NALU是H.264码流解码的基本单元。NALU包括起始码和数据部分,对于起始码,程序可以解析出0x000001或者0x00000001开头的NALU。程序由main()、int parse_h...
* 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline()。 * 备注:需要考虑的是异常情况 * @param filePath */...
JavaBytecodeAnalyzer 解析 Java 字节码,学习字节码指令集 解析 class 文件为字节码,以熟悉 class 文件结构 学习 java bytecode 指令集
Still.lua 文件导出一个解析器对象,可用于(使用方法语法)将包含 lua5.1 字节码的字符串解析为要加载到 Moonshine vm 中的 json 字符串。 (请注意,moonshine vm 对其 json 格式相当挑剔,因此请确保不要在字符串...
你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python “字节码”文件。(在 Python3 的时候这个 .pyc 后缀的文件不太好找了,它在一个名为__pycache__的子目录下面。).pyc文件可以防止Python每次运行时都...
本人写的电力行业报文解析工具,单文件免安装,随存随用,详细解析到每个字节。支持如下规约: 1.698.45报文解析;2.南网规约报文解析;3.376.2报文解析(茜茜写的);4.376.1规约帧结构解析;5.645.07表规约帧结构解析...
私人使用的一些小函数集合文件 作为自己的函数库一直经常使用 效率优,无错误
Java反编译工具,解析class字节码文件。 解析class字节码文件
字节码到 cfg 描述 使用 ASM 从 Java 字节码生成控制流图 作者 佩纳安东尼 布朗丁·尼古拉斯 巴登·杰里米 要求 已安装 开发商 您必须位于项目文件夹(pom.xml 文件所在的位置)才能使用以下命令进行编译: mvn ...
代码、API、字节码文件解析、Scanner类的使用等