zoukankan      html  css  js  c++  java
  • javap 反编译 java 字节码文件

    概述:
             javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。

    语法:
            把java文件编译为class文件:javac  Test.java  (Test.java为java文件名) 生成对应的 .class 文件 Test.class

            执行javap操作:javap 命令行 class文件名称(不加 .class后缀)

            例如: javap -c Test

    命令行
      -help 输出 javap 的帮助信息。
      -l 输出行及局部变量表。
      -b 确保与 JDK 1.1 javap 的向后兼容性。
      -public 只显示 public 类及成员。
      -protected 只显示 protected 和 public 类及成员。
      -package 只显示包、protected 和 public 类及成员。这是缺省设置。
      -private 显示所有类和成员。
      -J[flag] 直接将 flag 传给运行时系统。
      -s 输出内部类型签名。
      -c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
      -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
      -classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
         - bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelibt.jar 和 jrelibi18n.jar 中。
      -extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
    示例:
    一个Demo.java文件(存放在桌面)

    class Demo 
    {
    	public static void main(String[] args) 
    	{
    		Integer aInteger = 56;
    		int aInt=0;
    		int aInt2 = 123;
    		String s="helloworld";
    		String aString = new String("IamString");
    	}
    }

    反汇编结果

    Compiled from "Demo.java"
    class Demo {
      Demo();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
     
      public static void main(java.lang.String[]);
        Code:
           0: bipush        56
           2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           5: astore_1
           6: iconst_0
           7: istore_2
           8: bipush        123
          10: istore_3
          11: ldc           #3                  // String helloworld
          13: astore        4
          15: new           #4                  // class java/lang/String
          18: dup
          19: ldc           #5                  // String IamString
          21: invokespecial #6                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
          24: astore        5
          26: return
    }

    对其中的语法不清楚啊?可以参照一下这两篇博客:

    javap -c 命令详解 http://blog.csdn.net/junsure2012/article/details/7099222

    JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc) http://www.cnblogs.com/luyanliang/p/5498584.html

    如果还不清楚,放大招了:
    ORACLE 官方文档  Chapter 4. The class File Format  http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
     

    常用反编译工具:

    1、jd-gui:最好用,但有时反编译出来的结果会有遗漏。

            https://code.google.com/p/cxldemo/downloads/detail?name=jd-gui.exe&can=2&q

    2、DJ Java Decompiler:相对jd-gui易用性上差一些,但是反编译过来的结果更准确。

            http://www.neshkov.com/dj.html

    3、jclasslib bytecode viewer:将字节码转化为JVM指令的工具。

            http://sourceforge.net/projects/jclasslib/

    关注公众号 海量干货等你
  • 相关阅读:
    HMS Core携手AppGallery赋能越南游戏发行商
    如何在React Native项目中集成华为远程配置服务
    华为应用市场AGC研习社|如何提升投放转化,实现获量增长?
    教你用三种方式打造一款简单的网络播放器
    基于Cocos SDKHub接入华为HMS Game服务—接入华为应用升级服务
    手把手教您快速运行Unity华为游戏(GameService)
    做好复购预测,触达用户消费的核心痛点
    华为 HMS Core:以技术撬动生态的顽强生命力
    Cocos平台 | 快速集成AGC云函数服务
    DOM操作技术
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734145.html
Copyright © 2011-2022 走看看