浅谈javap命令拆解字节码文件

目的拆解分析反编译字节码 解析成人能够理解的结构 ,然后再对字节码文件进一步分析

源代码

public class test {
    private static int classV =2;
    public static void main(String[] args) {
        classV =200;
        int localV =4;
        localV =400;
    }
}

二进制
idea bin_ed插件查看。

看不懂 那就使用人能看的懂的汇编语言查看类文件结构和代码指令。

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."<init>":()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."<init>":()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               <init>
   #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               <clinit>
  #20 = Utf8               SourceFile
  #21 = Utf8               test.java
  #22 = NameAndType        #7:#8          // "<init>":()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."<init>":()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

1.1从45开始因为正式发布之前可能 其他版本号可能已经被用了
1.5改为5.0 也是差不多原因 为了表示重要性更名

Corresponding major version 指定版本 和"Supported major versions"兼容范围

附录2

附录3

直接分析字节码块

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];
}

附录4

常量池字节码结构和常量池结构部分对应关系

以上就是拆解字节码文件javap命令的详细内容,更多关于拆解字节码文件javap命令的资料请关注我们其它相关文章!

(0)

相关推荐

  • java中Servlet程序下载文件实例详解

    对于一些普通的文件下载,想必大家都会去点击默认的链接进行资料获取.效率慢是一个方面,有时候下载的过程并不顺序.在学习了python中的一些程序后,我们可以选择使用Servlet进行文件的下载.下面我们先就Servlet进行简单的说明,然后带来有关的下载文件代码实例. 1.说明 Servlet是Sun公司开发的用于交互式地浏览和生成数据,生成动态Web的技术.狭义的Servlet是指Java语言实现的一个接口.但一般情况下,我们把实现了Servlet接口的Java程序叫做Servlet 2.使用s

  • IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程

    最近突然看到这篇几年前随手记录的文章,居然浏览量那么高.看来很多小伙伴也开始从 Eclipse 转到 IDEA,这里为了让大家更好的掌握 IDEA 的使用,我建议大家可以看看下面这个 IDEA 教程. IDEA 教程:IntelliJ-IDEA-Tutorial 首先,确保 IDEA 软件正确安装完成,Java 开发工具包 JDK 安装完成. IntelliJ IDEA下载地址:https://www.jetbrains.com/idea/download/#section=windows JD

  • java不解压直接读取压缩包中文件的实现方法

    前言 最近写了个上传压缩包,将压缩包中的图片保存的接口,所以翻了翻网上文件流操作的博客,总结了一个不用解压,直接读取文件的方法 上代码 @RequestMapping(value = "packageUpload") public void packageUpload(HttpServletRequest request, HttpServletResponse response) { File file = null; try { MultipartHttpServletReques

  • Java定时调用.ktr文件的示例代码(解决方案)

    1.Maven依赖 <!-- Kettle --> <dependency> <groupId>pentaho-kettle</groupId> <artifactId>kettle-core</artifactId> <version>7.1.0.0-12</version> </dependency> <dependency> <groupId>pentaho-kettl

  • Java基础之文件概述

    一.基本概念和常识 下面,我们先介绍一些基本概念和常识,包括二进制思维.文件类型.文本文件的编码.文件系统和文件读写等. 1.1 二进制思维 为了透彻理解文件,我们首先要有一个二进制思维. 所有文件, 不论是可执行文件.图片文件.视频文件.Word文件.压缩文件.txt 文件,都没什么可神秘的,它们都是以0和1的二进制形式保存的.我们 所看到的图片.视频.文本,都是应用程序对这些二进制的解析结果. 作为程序员,我们应该有一个编辑器,能查看文件的二进制形式, 比如UltraEdit,它支持以十六进

  • JavaWeb实现文件的上传与下载

    JavaWeb实现文件的上传与下载,供大家参考,具体内容如下 第一步:导包 导入commons-fileupload-1.3.3.jar和commons-io-2.4.jar两个依赖包 第二步:编写前端页面 1.提交页面 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ tagl

  • java自定义ClassLoader加载指定的class文件操作

    继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo 首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /Users/allen/Desktop/cn/lijie/MyTest.class package cn.lijie; public class MyTest { public

  • Java(TM) Platform SE binary 打开jar文件的操作

    直接用javaw.exe想打开aspectj-1.9.4.jar安装aspectJ 选Java™ Platform SE binary提示JVM虚拟机打不开 可能是java的配置出了点问题,这里不想重新去配置java,直接用cmd用指令打开 成功打开AspectJ安装程序开始安装 补充:Java(TM) pPlatform SE binary已停止工作(解决办法) 问题描述: Java™ pPlatform SE binary已停止工作解决办法 问题事件名称:APPCRASH 早起清理了一下电脑

  • java 如何读取远程主机文件

    我就废话不多说了,大家还是直接看代码吧~ package com.cloudtech.web.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import com.cloudtech.web.entity.Role; public class

  • Java IO流学习总结之文件传输基础

    一.Java IO流总览 二.File类 2.1 常用API package pkg1; import java.io.File; import java.io.IOException; /** * @author Administrator * @date 2021/4/2 */ public class FileDemo { public static void main(String[] args) { // 了解构造函数,可查看API File file = new File("d:\\

  • Java 如何实现解压缩文件和文件夹

    一 前言 项目开发中,总会遇到解压缩文件的时候.比如,用户下载多个文件时,服务端可以将多个文件压缩成一个文件(例如xx.zip或xx.rar).用户上传资料时,允许上传压缩文件,服务端进行解压读取每一个文件. 基于通用性,以下介绍几种解压缩文件的方式,包装成工具类,供平时开发使用. 二 压缩文件 压缩文件,顾名思义,即把一个或多个文件压缩成一个文件.压缩也有2种形式,一种是将所有文件压缩到同一目录下,此种方式要注意文件重名覆盖的问题.另一种是按原有文件树结构进行压缩,即压缩后的文件树结构保持不变

  • Java实战之简单的文件管理器

    示例图 可以在指定目录下实现文件的创建.文件夹的创建.文件的复制.粘贴.删除.重命名.返回上一级目录.以及不同设备之间文件的发送 完整代码 package com.atguitu.java; public class FileDemo { public static void main(String[] args) { FileSystem fs = new FileSystem(); fs.start(); } } package com.atguitu.java; import java.a

随机推荐