一、源代码

public classPeople {privateString name;private intage;

}

二、利用Javap 反编译查看字节码结构信息

javap -v People.class

结果如下

Classfile /D:/work/byte-code/src/People.classLast modified2020-12-9; size 240bytes

MD5 checksum 54b8c1ad94a9c9cf5074fd8520454e9c

Compiled from"People.java"

public classPeople

minor version:0major version:52flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #3.#14 //java/lang/Object."":()V

#2 = Class #15 //People

#3 = Class #16 //java/lang/Object

#4 =Utf8 name

#5 = Utf8 Ljava/lang/String;

#6 =Utf8 age

#7 =Utf8 I

#8 = Utf8 #9 =Utf8 ()V

#10 =Utf8 Code

#11 =Utf8 LineNumberTable

#12 =Utf8 SourceFile

#13 =Utf8 People.java

#14 = NameAndType #8:#9 //"":()V

#15 =Utf8 People

#16 = Utf8 java/lang/Object

{publicPeople();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_01: invokespecial #1 //Method java/lang/Object."":()V

4: returnLineNumberTable:

line5: 0}

SourceFile:"People.java"

三、利用Uedit 打开class 文件(新发现010 编辑器更好用)

CA FE BA BE 00 00 00 34 00 11 0A 00 03 00 0E 07

00 0F 07 00 10 01 00 04 6E 61 6D 65 01 00 124C

6A61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 673B01 00 03 61 67 65 01 00 01 49 01 00 06 3C 696E69 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64

65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61

62 6C 65 01 00 0A 53 6F 75 72 63 65 46 69 6C 65

01 00 0B 50 65 6F 70 6C 65 2E 6A 61 76 61 0C 00

08 00 09 01 00 06 50 65 6F 70 6C 65 01 00 106A61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 00

21 00 02 00 03 00 00 00 02 00 02 00 04 00 05 00

00 00 02 00 06 00 07 00 00 00 01 00 01 00 08 00

09 00 01 00 0A 00 00 00 1D 00 01 00 01 00 00 00

05 2A B7 00 01 B1 00 00 00 01 00 0B 00 00 00 06

00 01 00 00 00 05 00 01 00 0C 00 00 00 02 00 0D

四、根据上述的十六进解释

ca fe ba be 魔数00 00次版本号00 34主版本号00 11 常量池数量(17-1 = 1~16)

0A00 03 00 0E #1,指向 #3 = #16 = java/long/Object, 指向#1407 00 0F #2 指向#15 = People

07 00 10 #3 指向#16 = java/lang/Object

07 01 00 04 #46E61 6D 65 //name

01 00 12 #54C 6A61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B //Ljava/lang/String;

01 00 03 #6

61 67 65 //age

01 00 01 #7

49 //I

01 00 06 #83C69 6E 69 74 3E //

07 00 03 #9

28 29 56 //()V

01 00 04 #10

43 6F 64 65 //Code

01 00 0F #114C69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 //LineNumberTable

01 00 0A #12

53 6F 75 72 63 65 46 69 6C 65 //SourceFile

01 00 0B #13

50 65 6F 70 6C 65 2E 6A 61 76 61 //People.java

0C 00 08 00 09 #14 指向 #8 = , 指向 #9 = ()V

01 00 06 #15

50 65 6F 70 6C 65 //People

01 00 10 #166A61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 //java/lang/Object

00 21访问标志位00 02 当前类索引 #2

00 03 父类索引 #3

00 00接口计数器00 02 字段计数器

00 02 字段访问标志 //private

00 04 字段名称 //#4 = name

00 05 字段描述符 // #5 = String

00 00 附属表

00 02 字段描述符 //private

00 06 字段名称   //age

00 07 字段描述符  // I = int

00 00 字段附属表

00 01 方法计数器  //一个方法

00 01 方法访问标志 //public

00 08 方法名称 //

00 09 方法描述符 // ()V

00 01 附属表计数器 // 方法一个附属表

00 0A 附属表名称  #10 = code

00 00 00 1D 附加属性长度 // 29

00 01 //栈最大深度为1

00 01 //临时变量数目为1

00 00 00 05 //字节码长度以及指令

2A //aload_0

B7 00 01 //invokespecial #1 = Methodref #3 #14

B1   // 表示return ,无返回值

00 00 //异常个数为0

00 01 //存在一个附加属性

00 0B //属性名称 = #11

00 00 00 06 // 附加属性长度

00 01 //存在一个line_number_table

00 00 //字节码 start_pc 为0

00 05 //源代码行号 Line Number 对应为5

00 01 //表示字节码附加属性个数为1

00 0c #12 指向 SourceFile

00 00 00 02 // SourceFile 属性后面所占字节为 2

00 0D # SourceFile 的索引,#13 = People.java

附录:

常量池项目类型

常量池中17种数据类型的结构总表

访问标志

字段表结构

字段访问标志

描述字符含义

方法表结构

方法访问标志

属性表

属性表结构

Code 属性表结构

Exception 属性结构

LineNumberTable 属性结构

SourceFile 属性结构

bytecode java_Java 字节码解读相关推荐

  1. 解读java_Java字节码解读

    1. 字节码 Java字节码是Java虚拟机执行的一种指令格式.class文件是编译器编译之后供虚拟机解释执行的二进制字节码文件. 下面举个例子,写一段Java打码,并编译. package com. ...

  2. python字节码解析_从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  3. 机器码和字节码的概念与区别

    什么是机器码 机器码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来理解的话,机器码就是计算机可以直 ...

  4. 【JVM学习笔记】-字节码-第一章(多图,多表,实操)

    一 什么是字节码 java中通过编译, 会将我们程序员编写的文件转换成为一种 .class结尾的文件,我们称之为字节码文件.它是一种二进制文件(很明显是给计算机看的文件),是Java虚拟机中运行的文件 ...

  5. asm(Java字节码操控框架)和 CGlib(Code Generation Library)

    asm概述 asm 是一个 Java 字节码操控框架. 它能够以二进制形式修改已有类或者动态生成类.ASM 可以直接产生二进制 class 文件,也可以在类被加载入Java 虚拟机之前动态改变类行为. ...

  6. Class文件结构和字节码指令集

    Class文件结构和字节码指令集 概述 字节码文件的跨平台性 Java 语言:跨平台的语言(write once, run anywhere) 当Java源代码成功编译成字节码之后,如果想在不同的平台 ...

  7. 字节码文件(Class文件)结构解读、理解与分析

    字节码(Class文件) 什么是字节码(Class文件)? 字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码.字节是电脑里的数据量单位. 对于 ...

  8. 使用JBE(Java Bytecode Editor)修改Java字节码

    JBE JBE(Java Bytecode Editor)是一个Java字节码编辑工具,而且是开源的,该项目是基于jclasslib ej-technologies( https://github.c ...

  9. python的字节码(ByteCode)

    0. 参考资料 参考资料如下: B站: [python]字节码和虚拟机?python代码竟然是这么执行的! python的编译字节码流程: PEP 3147 – PYC Repository Dire ...

最新文章

  1. 史上最全设计模式导学目录(完整版)
  2. Python编码规范:IF中的多行条件
  3. (一)U盘安装ubuntu18.04.1
  4. python开发工具与pycharm_python开发工具pycharm快速入门
  5. 【渝粤题库】国家开放大学2021春2745农村经济管理题目
  6. 买iphone不买android,为何宁可用4年前的苹果6s,也不买两三千的安卓呢?理由很真实...
  7. leetcode1082. 销售分析 I (SQL)
  8. 一、Web服务器——Tomcat Servlet学习笔记
  9. mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?
  10. python---基础知识
  11. EJB3.0学习笔记---第一个EJB程序:
  12. 探探自动右滑_利用AccessibilityService实现探探自动右划
  13. Leetcode刷题指南和top100题目
  14. apicloud开发时的一些注意点
  15. 索引法则--尽量使用覆盖索引
  16. Apizza在线接口工具如何支持RESTful Path 参数
  17. speedoffice如何在Word表格中插入行或列
  18. docker容器无root 权限,如何获得docker容器里面的root权限
  19. 用PS抠图做电子签名
  20. php短信报警直到响应,Cacti实现短信报警

热门文章

  1. Docker最全教程之Python爬网实战(二十二)
  2. 微软发布 Visual Studio 2019年第二季度路线图
  3. dotnet core开源博客系统XBlog介绍
  4. Dotnet Core Windows Service
  5. [信息安全] 4.一次性密码 amp;amp;amp;amp; 身份认证三要素
  6. 在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包
  7. Git 操作笔记/pip换源
  8. Android Studio 引用aar包 更新后找不到新增的方法问题(踩坑)
  9. 你不知道的无人机知识(建议收藏)
  10. 【数据库原理及应用】经典题库附答案(14章全)——第六章:关系数据库设计过程