本篇文章将介绍 .class 文件的结构,通过一个简单的例子认识 .class 文件。...class文件.放到Android Studio里面是这样的 package com.example.liuxiaojie.smalietest; import android.os.Bundle;...0000 1200 0200 0300 2200 2400 1900 0600 2200 2800 19 这里我全部贴出来了.可以看到都是由16进制数据组成.接下来,我们就可以根据一文让你明白Java字节码来解析整个文件...(整个过程其实挺累的,花了将近2个小时.难倒是不难,主要是一个一个要对照好挺困难的) 魔数(4)固定为 ca fe ba be 版本号(4)00 00 00 33,前面的0000是次版本号,后面的0033...文件的字节码有所了解了.可以看到,整个class文件的字节码都是一段一段对应好的了,每一块数据开始都是数据量,然后跟着数据,相对于dex文件而言,不用去查找偏移地址.下一篇会解析一下dex文件,解析完了就可以看到两者的区别
上述class的字节码主要由 魔数及版本信息、常量池、访问标识符、索引(类索引、父类索引、接口索引)、字段表、方法表、属性表。...2.2.1 魔数及版本信息 魔数(Magic Number):.class 文件的第 1 - 4 个字节,它唯一的作用就是确定这个文件是否是一个能被虚拟机接受的 class 文件,其固定值是:0xCAFEBABE...如果一个 class 文件的魔术不是 0xCAFEBABE,那么虚拟机将拒绝运行这个文件 次版本号(minor version):.class 文件的第 5 - 6 个字节,即编译生成该 .class...主版本号(major version):.class 文件的第 7 - 8个字节,即编译生成该 .class 文件的 JDK 主版本号。...字节码的二进制文件对应表示为: CA FE BA BE 00 00 00 34 那么前面的cafebabe就是魔数,而0000 和0034则分别是主版本号和次版本号。
Java 提供了一种在所有平台上都能使用的一种中间代码--字节码类文件(*.class文件) 有了字节码,无论哪种平台只要安装了虚拟机都可以直接运行字节码 有了字节码,解除了 Java 虚拟机和 Java...class 文件结构如下 魔数 版本号 常量池 访问标识 类/父类/接口 字段描述集合 字段描述集合 属性描述集合 当 JVM 加载某个 class 文件时,JVM 就是根据上图的结构进行解析 class...文件,使用 16 进制编辑器打开: 下面我们通过上图来一步步解析字节码文件: 1、魔数 magic numebr 在 class 文件开头的四个字节是 class 文件的魔数,它是一个固定值 0XCAFEBABE...魔数是 class 文件的标志,它是判断一个文件是不是 class 格式文件的标准。 2、版本号 前两个字节 0000 代表 次版本号 minor_version。...所以当前 class 文件的主版本号为 52,次版本号为 0,所以综合版本号是 52.0,也就是 jdk1.8.0。
0x02 class 文件结构 java 是跨平台的一门语言,但是 jvm 却不是跨平台的,但是不同平台的 JVM 帮我们屏蔽了差异,通过 JVM 可以把源代码编译成和平台无关的字节码,这样我们的源代码就不用根据不同平台编译成不同二进制是可执行文件了...class 文件由十部分组成,具体如下: 魔数(magic number) 版本号(minor&major version) 常量池(constant pool) 访问标记(access flag) 类索引...class 文件的魔数为0xcafebabe,虚拟机在加载类文件之前会先检验这 4 个字节,如果不是,那么会抛出java.lang.ClassFormatError异常。...2、版本号(minor&major version) 魔数之后的四个字节分别表示副版本号(Minor Version)和主版本号(Major Version)。...对于 JVM 来说,如果操作数是常用的数值,比如 0,那么就会把这些操作数内嵌到字节码中,而如果是字符串常量或者较大的整数时,class 文件会把这些操作数存储在常量池中,当要使用这些操作数的时候,会根据常量池的索引位置来查找
前言 最近在研究Java的反射和动态代理,发现使用这两个Java神器需要了解.class文件的字节码。于是翻阅了相关资料,在这篇博客中进行一番整理,也作为自己学习的记录。...如何阅读class文件 Java的可移植性是基于.java文件编译后形成的唯一的字节码文件.class文件可以在不同操作系统上的jvm运行的机制。....常量池 魔数(magic number) & 版本号 每个.class文件的头四个字节被称为“魔数”,其作用是确定该.class文件是否为一个能被HOTSPOT虚拟机接收的.class文件 魔数后面的四个字节是版本号...Java的版本号是从45开始的,自jdk1.1之后的每个jdk大版本发布的主版本号都向上+1,并且高版本的jdk能向下兼容以前版本的.class文件。...Code属性 Java程序方法体内的代码经过javac编译处理之后,最终编程字节码指令存储在Code属性内。这之后就涉及到了字节码执行引擎的问题,之后会在其他的博客中进行讲解,敬请期待。
,源文件名称就是我们Class文件属性表中的SourceFile属性。...(这个需要结合Class字节码文件结构来看) image.png 字节码结构有:魔数,副版本号,主版本号,常量池容量计数器,访问标志,类索引,父类索引,接口索引集合,字段表,方法表,属性表等。...魔数后面的4位就是版本号,也是4个字节,前2个字节表示次版本号,后2个字节表示主版本号,这二个版本号是为了标注jdk的一个版本,起到一个jdk版本兼容性的一个作用,比如说高版本的jdk代码不能使用低版本的...常量池后面就是访问标志,用两个字节来表示,其标识了类或者接口的访问信息,比如:这个.Class文件是类还是接口,是不是被定义成public,是不是abstract,如果是类,是不是被声明成final等。...在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须要有不一样的名称,但是对于字节码文件来说,如果两个字段的描述符不一致,那这二个字段重名就是合法的。
,源文件名称就是我们Class文件属性表中的SourceFile属性。...(这个需要结合Class字节码文件结构来看) 字节码结构有:魔数,副版本号,主版本号,常量池容量计数器,访问标志,类索引,父类索引,接口索引集合,字段表,方法表,属性表等。...魔数后面的4位就是版本号,也是4个字节,前2个字节表示次版本号,后2个字节表示主版本号,这二个版本号是为了标注jdk的一个版本,起到一个jdk版本兼容性的一个作用,比如说高版本的jdk代码不能使用低版本的...常量池后面就是访问标志,用两个字节来表示,其标识了类或者接口的访问信息,比如:这个.Class文件是类还是接口,是不是被定义成public,是不是abstract,如果是类,是不是被声明成final等。...在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须要有不一样的名称,但是对于字节码文件来说,如果两个字段的描述符不一致,那这二个字段重名就是合法的。
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。...Java 程序从源代码到运行一般有下面 3 步: 为什么要查看 Java 字节码? 我们在平时学习的时候,经常需要查看某个 java 类的字节码文件。...查看字节码文件更容易让我们搞懂 java 代码背后的原理比如搞懂 java 中的各种语法糖的本质。 如何查看 Java 字节码?...return m +1; } } 如果我们通过命令行来查看某个 class 的字节码文件的话,可以直接通过javap命令 先用 javac 命令编译出 class 文件: -rw-r--r--...Light.java 然后用javap 命令查看 class 文件的字节码: bytedance$javap -verbose Light 警告: 二进制文件Light包含light.sword.Light
Vdex Extractor 一款命令行工具,用于从Vdex文件反编译和提取Android Dex字节码的工具。...(默认:false) --no-unquicken : 禁用unquicken字节码反编译器 (don't de-odex) --deps : 转储经过验证的依赖信息...数据(旧vtable),用于恢复字节码优化过程中应用的dexto -dex转换。...谷歌已经发布了提供的补丁以及ART运行时的Android Pie版本。 验证迭代器的依赖关系 当第一次编译(优化)Dex字节码文件时,dex2oat将执行验证依赖项收集器,作为方法学验证者的一部分。...集成反汇编程序 为了调试反编译器并协助Dex字节码调查任务,实现了一个轻型反汇编程序。反汇编输出非常类似于platform/art项目的AOSP dexdump2实用程序提供的输出。
java-decompiler 反编译工具 Java Decompiler 是Java反编译工具,可以对 Java 5 和更高版本的 class 文件进行反编译分析。...主旨内容 Java Decompiler是一项开源工具,Java Decompiler工具不仅可以实现反编译.class文件,将.class文件变为可以被我们阅读的.java文件,而且还可以对jar包进行反编译...,得到jar包中.class文件反编译的.java文件。...jar文件是java的可执行文件,右键点击或双击下载后的jd-gui-1.4.0.jar文件即可运行该反编译工具,运行时可以看到咖啡的图标,传统Java=咖啡。...如果你安装的版本不是 jdk1.8,并且安装了多个Java版本,以上方法可能都不生效,但如果你认真看了,相信你一定可以找到方法。 引用 java-decompiler.github.io/
文章目录 一、字节码文件 与 JVM 二、字节码文件示例 三、字节码文件二进制结构分析 1、魔数 2、次版本号 3、主版本号 4、常量池个数 一、字节码文件 与 JVM ---- Java 源码编译成...Class 字节码 ; Java 虚拟机 可以被认为是一个 解释器 , 解释编译后的 Class 字节码文件 , 最后在不同的操作系统中运行 ; Android 虚拟机 不是 Java 规范的 虚拟机...字节码文件 : javac Student.java 字节码文件二进制数据分析 : 使用二进制查看工具查看 Student.class 字节码文件 , 这些二进制数值对应的就是 JVM 指令 ; CA...; 三、字节码文件二进制结构分析 ---- 分析字节码二进制文件时 , 可以参考 javap -v Student.class 命令输出的字节码附加信息进行理解 ; 1、魔数 magic ( 魔数 )...: 4 字节 , CA FE BA BE , 所有的 Class 字节码都是以 CafeBabe 信息开头的 ; 2、次版本号 minor_version ( 次版本号 ) : 2 字节 ,
JD-GUI 是一款免费且开源的工具,可以将 Java 字节码反编译为高质量的 Java 源代码。它提供了一个直观的图形界面,方便用户查看和分析已编译的类文件。...以下是 JD-GUI 的使用说明,帮助你探索 Java 字节码的奇妙世界。 第一步,下载和安装。...然后,浏览并选择你要反编译的已编译的 Java 类文件(.class 文件)或者包含类文件的文件夹。 第四步,查看反编译的源代码。选中左侧的类文件,右侧将显示反编译后的源代码。...JD-GUI 反编译工具为开发人员提供了一个便捷的方式来探索和理解已编译的 Java 类文件。它是一款功能强大、易于使用的工具,可以帮助我们解决了解和调试 Java 字节码的难题。...享受探索 Java 字节码的乐趣吧!
class name to class bytes: Map classBytes = new HashMap(); public...* * @param name * Full class name....* @return The Class instance....* @throws ClassNotFoundException * If class not found..... */ public Class<?
同一段 Java 程序在编译后生成的字节码文件是唯一的,不会因为平台的不同而产生任何的变化。而同一段字节码跑在不同实现的 JVM 上,会产生不同的机器指令。...那么,本文就来分析一下这个「字节码」文件,解开它的神秘面纱。...魔数与 Class 文件的版本 Class 文件开头的四个字节存储的是当前文件的「魔数」,所谓的「魔数」就是用于标识当前的文件是一个由 Java 文件编译过来的 Class 文件。...前者占两个字节,描述的是 Class 文件的「次版本号」,后者也占两个字节,描述的是 Class 文件的「主版本号」。...总体上而言,所谓的字节码文件,或者说 Class 文件就是编译器严格按照虚拟机规范生成的一串二进制,虚拟机在进行解析的时候也是严格按照虚拟机规范进行解析,这样就使得 Class 文件中所有的信息都能够被虚拟机读取解析
刚开始想直接将需要的class文件进行修改,发现这样一个问题,使用工具类将需要的位置字节码参数修改完之后,将修改后的文件压缩回原来的JAR,JAR不能用了。...IDEA插件:jclasslib Bytecode viewer jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含的字节码的工具。...另外,它还提供一个库,可以让开发人员读写Java类文件和字节码。...github 地址:https://github.com/ingokegel/jclasslib 这个插件是用来查看class字节码文件域的,只有找到对应的常量池、方法域、接口等的具体索引位置,才能使用强制的读写进制流的方式去修改...修改class文件 使用工具类修改class文件的的某个参数,或者某个字符串。这里有一点其实在java文件中定义的各种参数,编译成字节码文件的时候,都变成了字符串,只是逻辑位置不同,处于不同的域中。
* @return The compiled results as Map that contains class name as key, * class binary as
简言之:通过字节码文件对象,去使用该文件中的成员变量、构造方法、成员方法。 三种获取字节码文件对应的Class类型的对象的方式 要想解剖一个类,必须先要获取到该类的字节码文件对象。 ...而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。...文件对象的方式: 1:Object类的getClass()方法 2:数据类型的静态属性class(任意数据类型都具备一个class静态属性) 3:Class类中的静态方法(将类名作为字符串传递给...示例代码如下: 1 package cn.itcast_01; 2 3 /* 4 * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。...因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。
字节码文件是Java源代码编译后生成的一种中间形式,它包含了可以在Java虚拟机(JVM)上执行的指令集。字节码文件由一系列字节组成,每个字节都代表一个特定的操作码或数据。...下面是字节码文件的主要组成部分: 魔数(Magic Number):字节码文件的前4个字节是固定的魔数,用于标识该文件是否为有效的字节码文件。...在Java中,魔数的值为0xCAFEBABE。 版本号(Version):紧随魔数之后的两个字节表示字节码文件的版本号。这个版本号用于指示使用哪个版本的Java语言规范进行编译。...常量池(Constant Pool):常量池是字节码文件中最重要的部分之一。它包含了类、接口、字段、方法等的符号引用和字面值常量。...通过分析字节码文件,我们可以深入理解Java语言的底层机制,并进行性能优化和代码调试。
通常我们认为这个过程叫做Java语言的编译。其实,class文件仍然不是机器能够识别的语言,因为机器只能识别机器语言,还需要JVM再将这种class文件类型字节码转换成机器可以识别的机器语言。...javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。 什么是反编译?...Java语言中的反编译一般指将class文件转换成java文件。 有了反编译工具,我们可以做很多事情,最主要的功能就是有了反编译工具,我们就能读得懂Java编译器生成的字节码。...其实javap生成的文件仍然是字节码,只是程序员可以稍微看得懂一些。如果你对字节码有所掌握,还是可以看得懂以上的代码的。其实就是把String转成hashcode,然后进行比较。...PS: 但是,由于JAD已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败。
文章目录 前言 一、编译生成带局部变量表的字节码文件 二、局部变量表 前言 上一篇博客 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info...[] | 完整分析字节码文件中的常量池二进制数据 ) ; 一、编译生成带局部变量表的字节码文件 ---- 在 IntelliJ IDEA 中编写如下两个源码 : Java 类源码 : 在 setName...student = new Student(); } } 找到上述两个类编译后的字节码文件 : 根据上一篇博客 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 |...常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 ) 分析 , 常量池是如下选中的区域 ; Student.class 字节码文件的附加信息如下 : Y:\002...局部变量表 就是本博客介绍的 字节码文件 的局部变量表 ;
领取专属 10元无门槛券
手把手带您无忧上云