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/

    关注公众号 海量干货等你
  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734145.html
Copyright © 2011-2022 走看看