开发工具:IEDA、JDK1.8、WinHex

一、字节码文件结构

.Class 字节码中有两种数据类型:

  • 字节数据直接量:这是基本的数据类型。共细分为 u1 、 uZ 、 u4 、 u8 四种,分别代表连续的 1 个字节、 2 个字节、 4 个字节、 8 个字节组成的整体数据。
  • 表(数组):表是山多个基本数据或其他表,按照既定顺序组成的大的数据集合。表是有结构的,它的结构体现在:组成表的成分所在的位置和顺序都是已经严格定义好的。

Class字节码文件的整体结构

二、Demo分析

源代码:该代码贯穿整个字节码学习的章节

package com.jalja.java.bytecode;

/**
* @Auther: XL
* @Date: 2020/1/4 12:58
* @Description:
*/
public class BytecodeTest {
private int num=1; public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
}
}

javap -verbose 分析一个字节码文件,会输出字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中方法的信息、类变量与成员变量等信息

F:\workspace\IDEA\study\jalja-base-utils\target\test-classes>javap -verbose com.jalja.java.bytecode.BytecodeTest
Classfile /F:/workspace/IDEA/study/jalja-base-utils/target/test-classes/com/jalja/java/bytecode/BytecodeTest.class
Last modified 2020-1-4; size 514 bytes
MD5 checksum b661c2792027e7c9169a0266523412c1
Compiled from "BytecodeTest.java"
public class com.jalja.java.bytecode.BytecodeTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#20 // java/lang/Object."<init>":()V
#2 = Fieldref #3.#21 // com/jalja/java/bytecode/BytecodeTest.num:I
#3 = Class #22 // com/jalja/java/bytecode/BytecodeTest
#4 = Class #23 // java/lang/Object
#5 = Utf8 num
#6 = Utf8 I
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 LocalVariableTable
#12 = Utf8 this
#13 = Utf8 Lcom/jalja/java/bytecode/BytecodeTest;
#14 = Utf8 getNum
#15 = Utf8 ()I
#16 = Utf8 setNum
#17 = Utf8 (I)V
#18 = Utf8 SourceFile
#19 = Utf8 BytecodeTest.java
#20 = NameAndType #7:#8 // "<init>":()V
#21 = NameAndType #5:#6 // num:I
#22 = Utf8 com/jalja/java/bytecode/BytecodeTest
#23 = Utf8 java/lang/Object
{
public com.jalja.java.bytecode.BytecodeTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2 // Field num:I
9: return
LineNumberTable:
line 8: 0
line 9: 4
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/jalja/java/bytecode/BytecodeTest; public int getNum();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #2 // Field num:I
4: ireturn
LineNumberTable:
line 12: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/jalja/java/bytecode/BytecodeTest; public void setNum(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: iload_1
2: putfield #2 // Field num:I
5: return
LineNumberTable:
line 16: 0
line 17: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this Lcom/jalja/java/bytecode/BytecodeTest;
0 6 1 num I
}
SourceFile: "BytecodeTest.java"

WinHex:打开class文件

二、魔数(Magic Number)

1、魔数 :所有的class字节码文件的前四个字节都是魔数,魔数是固定值0XCAFEBABE,JVM加载class时会验证该数据是否符合规范。

二、版本号(Version)

2、版本号:

魔数之后的四个字节是版本信息,前两个字节(00 00)是次版本号(minor version: 0),后两个字节(00 34)是主版本号(major version: 52),34是十六进制转换十进制为52;52对应的就是JDK1.8;所以该class文件的版本号=1.8.0;用过java -version 可以验证。由于JVM是向下兼容,所以如何你的字节码文件版本号,小于等于当前JVM的版本,都是可以在当前JVM中运行的。

下一节:JAVA字节码文件之常量池

JAVA字节码文件之结构的更多相关文章

  1. JAVA字节码文件之第四篇(方法分析)

    一.Methods 方法字节码结构 Methods 字节码结构: Methods num:占两byte,Methods 的具体内存占n个byte 方法中每个属性都是Attribute_info,Att ...

  2. JAVA字节码文件之第三篇(访问标识)

    一.Access Flags 访问标志 访问标志信息包括该 Class 文件是类还是接口,是否被定义成 public 或者 abstract , 如果是类,是否被声明成 final. 访问标志表 二. ...

  3. JAVA字节码文件之常量池

    一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符 ...

  4. 【JVM故事】一个Java字节码文件的诞生记

    万字长文,完全虚构. (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李大胖也在心里开导自己,学生嘛,不能要求太高,只要肯上进,慢慢来.就称呼为小白吧. ...

  5. [置顶] Java字节码文件剖析

    Java为什么能够支持跨平台,其实关键就是在于其*.class字节码文件,因为*.class字节码文件有一个统一标准的规范,里面是JVM运行的时需要的相关指令,各家的JVM必须能够解释编译执行标准字节 ...

  6. 命令行中运行Java字节码文件提示找不到或无法加载主类的问题

    测试类在命令行操作,编译通过,运行时,提示 错误: 找不到或无法加载主类 java类 package com.company.schoolExercise; public class test7_3_ ...

  7. 【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法

    研究synchronized底层实现,涉及到查看java字节码的需要 前提是,你的PC已经成功安装了JDK并别配置了环境变量. ==========查看方法========= 一.javap查看简约字 ...

  8. java字节码文件指令集

    网上找的没有指令码这列  自己把它加上 更方便查阅 指令从0x00-0xc9 没有0xba 常量入栈指令 指令码 操作码(助记符) 操作数 描述(栈指操作数栈) 0x01 aconst_null nu ...

  9. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

随机推荐

  1. 洛谷 2158 [SDOI2008]仪仗队

    Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...

  2. TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    TP-Admin即基于ThinkPHP5的web后台管理系统(总结一套自己的后台管理系统,方便自己后续的项目开发.) 主要特性:自适应手机端.支持国际化.吸取其他CMF框架优点.多站点部署.日志记录. ...

  3. phpstorm IDEA 双击Shift键会弹出 SearchEverywhere 对话框,如何取消这个功能

    https://blog.csdn.net/qq_27598243/article/details/80526352 解决方法:一:Open lib/resources.jar/idea/Platfo ...

  4. WebStorm使用参考手册

    WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑 ...

  5. SuperSocket 中内置的 Flash/Silverlight 策略服务器

    关键字: 策略服务器, Flash策略服务器, Silverlight策略服务器, Policy Server, Flash Policy Server, Silverlight Policy Ser ...

  6. 【原生JS】评论编辑器 文本操作

    效果图: HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  7. html(二)登陆页面

    今天开始正常上课学习HTML+CSS+JSP  嗯 前两个没讲直接上手! 老师也是很认同我们的呢~ 这是第一个案例 做一个登陆页面,并利用post提交表单 传值到另一个界面接收值. 1.设置值: &l ...

  8. 试用ZooKeeper

    ZooKeeper下载 通过ZooKeeper官网下载最新的稳定版本 解压ZooKeeper到某个目录,其目录结构为: 运行环境要求 系统环境 ZooKeeper对于市面上各种操作系统都有了不错的支持 ...

  9. 几种常见排序算法的基本介绍,性能分析,和c语言实现

    本文介绍6种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚,本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换 ...

  10. linux Tasklet 实现

    记住 tasklet 是一个特殊的函数, 可能被调度来运行, 在软中断上下文, 在一个系统决 定的安全时间中. 它们可能被调度运行多次, 但是 tasklet 调度不累积; ; tasklet 只 运 ...