精华内容
下载资源
问答
  • 在上一篇文章《StringBuilder、StringBuffer与Java字符串处理》中,我们反汇编了Java字节码文件,通过查看编译器编译后的字节命令,我们能够更清楚地了解Java在字符串拼接等方面的处理机制。 那么,我们如何反...

    在上一篇文章《StringBuilder、StringBuffer与Java字符串处理》中,我们反汇编了Java字节码文件,通过查看编译器编译后的字节命令,我们能够更清楚地了解Java在字符串拼接等方面的处理机制。

    那么,我们如何反编译指定的Java字节码文件呢?其实,在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)。

    我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件。在使用javap的相关dos命令之前,你必须确保已经将JDK安装目录\bin添加到环境变量path中。

    接着,我们就可以使用javap来反编译指定的Java字节码文件了。在此之前,我们先通过javap的帮助命令javap -help查看javap相关指令的用法。

    javap-help

    从上述内容我们可以知道,javap的使用命令格式为javap 选项参数 类名,其中选项参数可以有多个,中间用空格隔开,也可以一个都没有。下面我们编写如下源代码文件(包名test,类名Person),并将其编译为Person.class字节码文件。

    1. package test;public class Person {
    2.     public Person(String name, int age, boolean gender, String address) {
    3.         this.name = name;
    4.         this.age = age;
    5.         this.gender = gender;
    6.         this.address = address;
    7.     }
    8.     private String name; // private修饰符
    9.     int age; // 默认无访问修饰符(即下面所说的package、friendly)
    10.     protected boolean gender; // protected修饰符
    11.     public String address; // public修饰符
    12.     public String getName() {
    13.         return name;
    14.     }
    15.     public void setName(String name) {
    16.         this.name = name;
    17.     }
    18.     public void sayHi() {
    19.         System.out.println("Hello, my name is " + this.name);
    20.     }
    21. }

    接着将包名文件夹test及Person.class放置在D:\java目录下。以便于我们使用javap命令进行测试。

    java-person-class

    在执行命令之前,我们需要将dos窗口的当前工作目录变更为D:\java\test

    cd-current-dir

    1、使用不带任何选项参数的命令:javap Person

    javap-person

    javap Personjavap -package Person的显示结果一样,因为-package选项参数是默认的,用于显示package(不带任何访问修饰符,即我们常说的friendly)、protectedpublic修饰的类或成员。

    备注:在dos下进入工作目录D:\java,然后使用命令javap test.Person也可以实现上述操作。下同。

    2、使用命令:javap -public Person显示public修饰的类或成员。

    javap-public-person

    与此类似,选项参数-protected用于显示protected以上访问级别(protectedpublic)的类或成员;选项参数-private用于显示private以上访问级别,也就是所有的类或成员。

    3、使用命令:javap -public -l Person显示public修饰的类或成员,并显示行号表格和本地变量表格。

    javap-public-l-person

    4、使用命令:javap -c Person显示Person.class反汇编出的字节码命令。

    javap-c-person

    由于选项参数之间组合较多,因此其他选项参数不再一一截图赘述,仅在下面使用文字进行说明:

    -classpath <pathlist>
    手动指定用户class字节码文件的存放目录,javap程序将在此目录下查找class文件,多个路径以英文分号分隔。例如:javap -classpath D:\java\test Person(即使DOS窗口的当前工作目录为其他任意路径,该命令均可正确执行)。
    -s
    打印变量的内部类型签名,例如:javap -classpath D:\java\test -s Person。
    -extdirs <dirs>
    指定javap搜索已安装的java扩展的位置,默认的java扩展的位置为jre\lib\ext。例如:javap -classpath D:\java\test -extdirs D:\java\myext Person
    -bootclasspath <pathlist>
    指定使用Java底层类加载器(bootstrap class loader)加载的字节码文件的位置。例如:javap -classpath D:\java\test -bootclasspath D:\java\core Person
    -verbose
    打印方法参数和本地变量的数量以及栈区大小。
    -J<flag>
    使用javap.exe来执行java.exe虚拟机的相关命令,例如javap -J-version相当于java -version,可以有多个命令,中间以空格隔开。
    展开全文
  • 概述:javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。语法:把java文件编译为class文件:javacTest.java(Test.javajava文件名) 生成对应的 ....

    概述:

    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."":()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."":(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/

    展开全文
  • 概述:javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。语法:把java文件编译为class文件:javacTest.java(Test.javajava文件名) 生成对应的 ....

    概述:

    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."":()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."":(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/

    本文同步分享在 博客“SoWhat1412”(CSDN)。

    如有侵权,请联系 support@oschina.cn 删除。

    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    展开全文
  • javap 反编译 java 字节码文件

    千次阅读 2019-11-13 19:17:57
    javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。 语法: 把java文件编译为class文件:javacTest.java(Test.javajava文件名) 生成对应的 ....

    概述:
             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/

    展开全文
  • 使用javap反编译Java字节码文件

    千次阅读 2016-06-23 09:17:31
    我们如何反编译指定的Java字节码文件呢?其实,在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)。 我们可以在dos窗口中使用javap来反汇编指定的Java字节码...
  • javap反编译java字节码文件

    千次阅读 2016-08-16 14:58:17
     javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。 语法:  把java文件编译为class文件:javac Test.java (Test.javajava文件名) 生成对应...
  • 本文主要介绍了介绍了Java中的一些基础知识点以及Java中的字节码。重点讲述了如何编译Java代码并查看字节码文件,并实际分析了一段字节码文件,便于更好的理解Java的字节码
  • java字节码文件反编译

    2018-01-17 11:12:14
    jd-gui java字节码编译 class反编译 jd-gui java字节码编译 class反编译
  • 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10125638.html
  • 我们把C代码编译java字节码,这样我们的C语言便具备了可跨品台属性。通过把C语言编译java字节码,我们不但能够继续学习和掌握编译原理相关的算法技术,于此同时,还能深入理解java虚拟机的基本原理,此乃...
  • java编译字节码解析

    2016-12-29 14:14:00
    java编译字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260 一、编译文件字节码解析 模数 u4 次版本号 u2 主版本号 u2 常量池 u2 类访问表示 u2 类名 u2 父类 u2 接口 u2 字段数目...
  • java .net 反编译工具 字节码编译
  • Java字节码编译

    2009-10-27 17:39:24
    Java字节码编译,可以将*.class文件返编译成.java文件
  • 怎么用java自带反编译工具查看java字节码文件图文教程,用java自带反编译工具查看java字节码文件,首先,配置好java开发环境,环境变量各种配置,这里就不一一说了,相信大家都配置好了。下面入正题----怎么用java...
  • JAVA 字节码编译流程背景创建测试代码编译java程序反编译生成的class文件得到汇编程序对比java程序和汇编,快速提高看汇编能力 背景 近期要抓一个apk的蓝牙包,抓是抓到了,但是命令挺多的,流程方面还得反编译代码...
  • 一、新建HelloWorld.java文件,内容如下(简易): public class HelloWorld { public int firstStack() { int a = 100; int b = 100; int c = 100; return (a+b)*c; } } 二、将后缀名为java的...
  • javap 反编译Java class字节码

    万次阅读 2016-08-04 13:32:41
    javap是Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。用于分解class文件。  javap.exe位于C:\Program Files\Java\jdk1.8.0_91\bin。由于在环境变量 -> Path 中设置了%JAVA_HOME%\bin的...
  • javac命令可以编译java文件,也可以查看字节码文件 将java文件编译成字节码文件的功能是用java写的,项目为%JAVA_HOME%\lib\tools\com\sun\tools\javac
  • 编译 什么是编译 编译方式 反编译 字节码 反汇编
  • java语言为什么要先编译字节码

    千次阅读 2019-05-01 17:56:50
    书上说,Java靠中间语言(Java字节码)实现了跨平台。一直不是很理解,既然Java语言在不同平台编译出的字节码都一样,再由虚拟机将字节码翻译为机器码,那为什么还需要先编译为字节码呢?实现跨平台不都是虚拟机的...
  • java字节码编译工具

    2008-10-11 16:35:44
    java字节码编译工具 JAD+FrontEnd
  • Java字节码编译工具 jclasslib

    千次阅读 2018-09-01 18:21:38
    Java 字节码编译工具   在对 Java 代码执行过程效率分析过程中会很经常查看代码编译后的字节码,或者将字节码编译后,查看Java底层对于原来代码的优化结果,当然 JDK 本身已经提供了 javap 反编译工具可以...
  • 1.简述java语言具有一处编译,到处运行,该功能实现原理是基于class文件实现的,java格式文件经过编译后生成class文件,jvm加载class文件进行运行,不管什么格式的文件只要能编译成符合规范的class文件,那么就可以...
  • java编译查看字节码

    千次阅读 2014-04-01 22:42:38
    jdk中的bin里面自带有反编译的程序,叫javap.exe,利用他可以从编译生成的.class查看出对应的字节码代码 具体方法如下: 1.javap -verbose ** >> **.txt 例: 随便写个java类Person class Person{ String name;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,923
精华内容 8,369
关键字:

编译java字节码

java 订阅