实现语言与操作系统的无关性基础仍然是虚拟机和字节码储存格式,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
相关推荐
Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...
字节码文件结构包括魔术数字、版本信息、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合和属性表集合等。 4. **字节码分析工具**: 对字节码进行深入研究,通常会用到如jad、 ...
标题中的“class运行器v6”是一个用于执行Java字节码文件的应用程序,它允许用户在没有完整Java环境的情况下运行单个.class文件。这个工具可能是由开发者为了方便测试或教学目的而创建的,特别是对于那些不熟悉或者...
Java字节码文件反编译是一项重要的技术,它允许开发者查看和理解已编译的Java类文件(.class文件)内部的源代码结构。在Java中,源代码被编译成字节码,这是一种中间语言,由Java虚拟机(JVM)执行。然而,有时我们...
一个使用Java完成的解析JVM字节码文件的框架。 该框架的愿景为:从零到一实现一个字节码解析类库,从中了解JVM的一些规范,和Java代码编译后的组织方式。借助GraalVM的native-image工具,实现一个输出友好且漂亮的...
Java程序在执行时,首先需要通过Java编译器将源代码(.java文件)编译成二进制的字节码文件(.class文件),这些字节码由Java虚拟机(JVM)解析并执行。深入理解字节码结构有助于我们了解Java程序的运行机制,优化...
class文件结构解析字节码后文件
标题中的"字节码解析01.rar"指的是一个压缩包文件,包含了关于字节码解析的初步内容。这个教程可能是为那些想深入了解Java字节码工作原理或者希望自定义字节码解析工具的学习者准备的。 描述中提到,这个教程会展示...
- **解析:** Java源代码文件通常以`.java`为扩展名,在经过Java编译器(如javac)编译后会生成字节码文件,其扩展名为`.class`。字节码是一种中间代码形式,可以在任何支持Java虚拟机(JVM)的平台上运行而无需重新...
Java字节码分析工具,系统分析了java字节码文件,即java class类文件,对该文件中的各种成分以树的形式描述出来,只能针对未加密的class文件,一般由标准java编译器编译生成的class文件都未加密,该系统在vs2003下面...
本文将深入探讨字节码的概念,通过具体的示例和常量池的解析来阐述其工作原理。 首先,我们需要理解什么是字节码。字节码是一种中间表示形式,它是Java源代码编译后的产物,存储在.class文件中。每个字节码指令都是...
其中,加载阶段就是JVM查找并解析字节码文件的过程。Java类的加载主要由类加载器完成,它分为引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ...
在Java开发过程中,有时我们需要对已编译的`.class`字节码文件进行修改,以满足特定需求或优化代码。这个压缩包`修改class字节码需要的工具.zip`提供了几种常用的工具,帮助开发者实现这一目标。以下是这些工具的...
标题和描述中提到的“jclasslib”是一款名为JClasslib的开源工具,专门用于查看和分析Java类文件的字节码。字节码是Java平台中的一种中间语言,它在Java源代码被编译后产生,位于虚拟机执行之前。JClasslib提供了一...
1. **解析字节码**:首先,反编译器会读取字节码文件,并解析其中的指令和数据结构。这包括方法定义、类信息、常量池等。 2. **逆向工程**:解析后的字节码会被转化成更易于理解的控制流图(CFG),反编译器试图...
5. **加载并运行**:将生成的新字节码文件加载到Dalvik VM或者ART中,应用运行时会执行这些修改过的字节码。 在"plugin-master"这个项目中,可能包含了一个关于如何使用ASM进行Android字节码插桩的示例或者教程。...
在Android系统中,Dalvik虚拟机是Android应用执行的核心组件,它负责解析并执行APK中的 Dex(Dalvik Executable)文件,这是Android应用程序的字节码格式。本篇文章将深入探讨如何在Android运行时环境中修改Dalvik...
1. **分析**:首先,编辑器会读取`.class`文件,解析其中的字节码,将其转换为人类可读的格式,如汇编语言形式,便于理解。 2. **编辑**:然后,用户可以查看并修改这些指令。这可能涉及到替换特定的字节码,插入新...
《深入解析:修改字节码工具——jclasslib》 在Java编程中,字节码是JVM(Java虚拟机)执行的中间语言,它是由Java编译器将源代码编译成的一种二进制格式。理解并操作字节码对于优化程序性能、调试、逆向工程以及...