关于Java反编译字节码文件
作者:ThinkStu 发布时间:2021-10-07 01:41:32
如何查看 Java 的字节码文件?
在 Java 中,字节码文件.class
实际上是二进制文件,并不能直接查看。要想查看,我们只能通过反编译对其进行解析,然后查看解析后的源码。
如何反编译字节码文件
要想反编译字节码文件,我们首先要对.java
文件进行编译,得到字节码.class
文件。以Java 类 HelloWorld.java
为例:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
javac HelloWorld.java
然后使用 JDK 自带的字节码反编译工具javap
对.class
文件进行反编译:
javap -c HelloWorld
# 下面为反编译后的内容
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7
3: ldc #13
5: invokevirtual #15
8: return
}
javap 参数详解
javap是一个用于反汇编Java类文件的命令行工具,可以用来查看Java类的字节码信息。
javap的常用参数如下:
-c:以指令序列的形式输出字节码文件。
-v:以详细信息的形式输出字节码文件。
-s:输出Java源代码中的所有常量池字符串。
-l:输出行号表和局部变量表。
-classpath:指定查找类文件的路径,可以是目录名或者Jar文件名。
-J:传递参数给JVM,例如指定最大堆内存大小等。
附录:反编译字节码后的格式说明
Java类的字节码信息格式是一种二进制格式,它由一系列字节码指令构成。Java类的字节码信息可以通过javap命令来查看,可以以不同的格式输出。
魔数(Magic Number):4个字节,标识文件类型,Java类文件的魔数为0xCAFEBABE。
版本号(Version Number):2个字节,表示类文件的版本信息。
常量池(Constant Pool):由一系列常量表项(Constant Pool Entry)构成,用于存储常量池中的常量。
访问标志(Access Flags):2个字节,用于描述类或接口的访问修饰符,例如public、final、abstract等。
类索引、父类索引和接口索引表:4个字节,分别用于表示该类、父类和实现的接口在常量池中的索引。
字段表和方法表:由一系列字段表项(Field Table Entry)和方法表项(Method Table Entry)构成,用于存储类的字段和方法信息。
属性表:由一系列属性表项(Attribute Table Entry)构成,用于存储类、字段或方法的其他属性信息,例如注解、源文件名等。
来源:https://thinkstu.blog.csdn.net/article/details/129527592


猜你喜欢
- 本文实例讲述了C#生成随机数功能。分享给大家供大家参考,具体如下:using System;using System.Collections
- 本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。1、日期时间字符串转换成毫秒@Testpublic void
- 一、前言随着互联网项目前后端分离方式的流行,前端与后端交给不同的人员开发,项目沟通成本也随之提高。主要表现在WebAPI接口的沟通,Swag
- 这篇文章主要介绍了如何通过Java实现时间轴过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- Spring2.5.6开发环境搭建的过程,供大家参考,具体内容如下1、jar 包准备:spring 2.5.6 的 jar 包(链接: ht
- 安卓和苹果的客户端开发中,经常会使用到webview,我们一般做法是将webview加入到native页面中。当我们对页面进行销毁的时候,其
- 本文实例为大家分享了unity shader实现光照效果的具体代码,供大家参考,具体内容如下效果图:shader被附给了球。灯光需要在属性面
- 1. 启动入口本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈前面我们已经分析完
- 一、前言Redis是一个NoSQL(非关系型数据库)数据库之一,key-value存储系统或者说是一个缓存键值对数据库,具有如下特性:基于内
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- 现在网上很多应用都是用二维码来分享网址或者其它的信息。尤其在移动领域,二维码更是有很大的应用场景。因为项目的需要,需要在网站中增加一个生成二
- <script>//验证身份证号方法var test=function(idcard){var Errors=new Array
- Interceptor讲到Interceptor,相信熟悉struts2的童鞋肯定不会陌生了,struts2可以自定义 * 进行自己想要的一
- SpringBoot后台如何实现文件上传下载?最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的
- 本文实例为大家分享了WPF实现半圆形导航菜单的具体代码,供大家参考,具体内容如下实现效果如下:思路:扇形自定义控件组合成半圆型菜单,再通过c
- 这篇文章主要介绍了java加载property文件配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 方式一 通过Map.keySet使用iterator遍历@Testpublic void testHashMap1() { Map<I
- 1、JavaBean介绍 * JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)
- 1.前言任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异
- 在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,这