代码之家  ›  专栏  ›  技术社区  ›  hhafez

理解Java字节码

  •  17
  • hhafez  · 技术社区  · 15 年前

    我经常被一个没有源码的Java类文件所困扰,我试图理解我手头的问题。

    注:反编译程序是有用的,但在所有情况下都不够…

    我有两个问题

    1. 有什么工具可以查看Java字节码(最好是从Linux命令行获得)
    2. 什么是熟悉Java字节码语法的好参考?
    6 回复  |  直到 12 年前
        1
  •  18
  •   Community CDub    7 年前

    而不是直接查看Java字节码,这将需要熟悉Java虚拟机及其操作,可以尝试使用Java反编译实用程序。反编译器将尝试创建 java 源文件来自指定的 class 文件。

    这个 How do I “decompile” Java class files? 是一个相关的问题,它将有助于了解如何反编译Java。 文件夹。

    也就是说,我们可以使用 javap 命令,它是JDK的一部分,用于分解Java 文件夹。产量 贾瓦普 将是包含在 文件夹。但是要注意的是,字节码根本就不类似Java源代码。

    学习Java字节码和Java虚拟机本身的明确来源将是 The Java Virtual Machine Specification, Second Edition . 特别地, Chapter 6: The Java Virtual Machine Instruction Set 具有所有字节码指令的索引。

        2
  •  14
  •   Randy Sugianto 'Yuku'    15 年前

    要查看类文件的字节码指令,请使用 javap -v 命令,与运行Java程序一样,指定类路径(如果必要)和类名。

    例子:

    javap -v com.company.package.MainClass
    

    关于字节码指令集, Instruction Set Summary

        3
  •  2
  •   Denis Tulskiy    15 年前

    Fernflower 是一个分析反编译程序,所以它将把类分解成一个可读的Java代码而不是字节码。当你想了解代码是如何工作的时候,它会更有用。

        4
  •  1
  •   James Black    15 年前

    如果您有一个类而没有源代码,但是您有一个bug,那么您可以执行以下两个基本操作之一:

    1. 反编译、修复错误并重新创建JAR文件。我以前做过,但是系统管理员对将其投入生产持谨慎态度。
    2. 为类编写单元测试,确定导致错误的原因,用单元测试报告错误,然后等待修复。

      (2)根据我的经验,通常是系统管理员喜欢的。

      如果您使用(2),那么,同时,由于您知道导致错误的原因,您可以不允许该输入进入类,以防止出现问题,或者准备在错误发生时正确地处理它。

      您还可以使用AspectJ将代码注入到问题类中,并在不实际重新编译的情况下更改方法的行为。我认为这可能是更好的选择,因为您可以为所有可能调用函数的代码更改它,而不必担心向每个人传授有关问题的知识。

      如果你学会了阅读字节码指令,你会怎么做来解决这个问题?

        5
  •  0
  •   Stephen C    15 年前

    我有两个问题

    1)有什么工具可以查看Java字节码(最好是可用的) 从Linux命令行)

    这个 javap 工具(带有-c选项)将反汇编字节码文件。它从命令行运行,并作为Java SDK的一部分提供。

    2)什么是熟悉Java字节码语法的好参考

    这个 JAVAP 工具使用的语法与JVM规范中使用的语法相同,并且JVM规范自然是最终的源代码。我还发现了Bill Venners的“Java虚拟机内部”。我从来没有读过它,看起来它可能已经绝版了。

    实际(文本)语法简单且无需解释…假设您有一个解释字节码功能的引用,并且您对阅读这一级别的代码有一定的了解。但是,即使字节码是通过模糊器输入的,也可能更容易读取反编译器的输出。

        6
  •  0
  •   Thorbjørn Ravn Andersen    15 年前

    您可能会发现Eclipse字节代码大纲插件很有用:

    http://andrei.gmxhome.de/bytecode/index.html

    我自己也没用过,只是偶尔看到上面提到过。