java如何拆解字节码文件
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要讲解了"java如何拆解字节码文件",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java如何拆解字节码文件"吧!源代码public cla
千家信息网最后更新 2025年11月11日java如何拆解字节码文件
这篇文章主要讲解了"java如何拆解字节码文件",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java如何拆解字节码文件"吧!
源代码
public class test { private static int classV =2; public static void main(String[] args) { classV =200; int localV =4; localV =400; }}javap 指令和选项
0:无选项
打印package, protected and public fields, and methods public class com.example.test { public com.example.test(); public static void main(java.lang.String[]); static {};}1:辅助指令
-help
-help
-?
2:代码行号和方法的局部变量表
-l
public class com.example.test { //默认构造方法 public com.example.test(); //代码行号:命令偏移位置 LineNumberTable: line 3: 0 //局部变量表 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/example/test; public static void main(java.lang.String[]); //代码行号:命令偏移位置 LineNumberTable: line 6: 0 line 7: 6 line 8: 8 line 9: 12 //局部变量表 LocalVariableTable: Start Length Slot Name Signature 0 13 0 args [Ljava/lang/String; //方法参数 8 5 1 localV I。/局部变量localV //静态代码块 static {}; LineNumberTable: line 4: 0}3 用级别过滤方法 属性 类
-public
-protected
-private
-p
4.反汇编 出汇编指令
javap -c
//纯汇编指令public class com.example.test { public com.example.test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: sipush 200 3: putstatic #2 // Field classV:I 6: iconst_4 7: istore_1 8: sipush 400 11: istore_1 12: return static {}; Code: 0: iconst_2 1: putstatic #2 // Field classV:I 4: return} 5 显示verbose详细信息
javap -v
Classfile /Users/zhangshanxue/Downloads/akka-quickstart-java/target/classes/com/example/test.class//javap -sysinfo显示下面3行 Last modified 2021-4-5; size 507 bytes MD5 checksum 24a0c74751aafd61d0f7f69be9c161db Compiled from "test.java"public class com.example.test//即1.8 对照表和原因见附录1 //u2类型 即每个占用两个字节 minor version: 0 major version: 52 //类标志 见附录2 //u2类型access_flags 通过位与表示多个权限 flags: ACC_PUBLIC, ACC_SUPER //常量池。class文件结构重点 //u2 2两个字节 表示数量//pool 常量池//constant_pool_count 和constant_pool[]表示为常量池中内容//后面大部分内容依赖此常量池Constant pool: #1 = Methodref #4.#22 // java/lang/Object."":()V #2 = Fieldref #3.#23 // com/example/test.classV:I #3 = Class #24 // com/example/test #4 = Class #25 // java/lang/Object #5 = Utf8 classV #6 = Utf8 I #7 = Utf8 #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 LocalVariableTable #12 = Utf8 this #13 = Utf8 Lcom/example/test; #14 = Utf8 main #15 = Utf8 ([Ljava/lang/String;)V #16 = Utf8 args #17 = Utf8 [Ljava/lang/String; #18 = Utf8 localV #19 = Utf8 #20 = Utf8 SourceFile #21 = Utf8 test.java #22 = NameAndType #7:#8 // "":()V #23 = NameAndType #5:#6 // classV:I #24 = Utf8 com/example/test #25 = Utf8 java/lang/Object{ public com.example.test(); descriptor: ()V flags: ACC_PUBLIC Code: //代码汇编指令 stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return //Javap -l显示下面信息 //行号和上面对应的指令偏移位置 LineNumberTable: line 3: 0 LocalVariableTable: //局部变量表 在指令偏移位置start start+length之间有效 Start Length Slot Name Signature 0 5 0 this Lcom/example/test; public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: //代码汇编指令 stack=1, locals=2, args_size=1 0: sipush 200 3: putstatic #2 // Field classV:I 6: iconst_4 7: istore_1 8: sipush 400 11: istore_1 12: return //Javap -l显示下面信息 //行号和上面对应的指令偏移位置 LineNumberTable: line 6: 0 line 7: 6 line 8: 8 line 9: 12 LocalVariableTable: Start Length Slot Name Signature 0 13 0 args [Ljava/lang/String; 8 5 1 localV I static {}; descriptor: ()V flags: ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_2 1: putstatic #2 // Field classV:I 4: return //行号和上面对应的指令偏移位置 LineNumberTable: line 4: 0
直接分析字节码块
1为了方便交流表达class文件的结构
使用u1 u2 u4 u8无符号数表示字节数使用*_info 结尾表示池(数组cp_info、field_info、method_info、attribute_info
ClassFile { //表示java class的文件格式 固定为cafe baby 4个字节 u4 magic; //主版本号和次版本号共同决定了类文件格式的版本//u2类型 即每个占用两个字节//56包含56以后support for N.0 and N.65535 u2 minor_version; //主版本号56(java12)之前 minjor只支持0 u2 major_version; //常量池数量 u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; //this_class、super_class、interfaces指向常量池的CONSTANT_Class_info u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; //指向常量池structures:CONSTANT_Fieldref_info 结构 field_info fields[fields_count]; u2 methods_count; //指向常量池CONSTANT_Methodref_info 结构 method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count];}感谢各位的阅读,以上就是"java如何拆解字节码文件"的内容了,经过本文的学习后,相信大家对java如何拆解字节码文件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
字节
指令
文件
常量
代码
位置
行号
偏移
变量
局部
拆解
内容
方法
版本
结构
两个
信息
指向
类型
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机网络技术运用现状分析
上海海事大学数据库
建模软件开发需要多少钱
软件开发联禾
济南鹏展网络技术
ucsc 数据库
无管理服务器介绍
国产服务器是怎样的
网络服务器根据什么可分为
济宁党员教育软件开发系统
数据库安装第一步没反应
游侠服务器在哪个省
无标题数据库
军人手机网络安全防范讨论
数据库底层如何存储
电脑网络安全考试试题
服务器外服
用什么软件开发电工教学课件
数据库delete表
软件开发公司的营业范围
服务器如何设置来电启动
吉林专业软件开发五星服务
cosa系统软件开发
信达在线网络技术
战时网络安全基地
数据库实体安全
dell服务器630
如何做到数据库共享
防止数据库死锁6
如何招标确定软件开发公司