如何手动读取java字节码仅用于理解目的? [关闭]

问题描述 投票:0回答:3

我正在阅读这个wiki article关于如何将一些代码转换为Java bytecode。我遇到了这个例子:

Consider the following Java code:

  outer:
  for (int i = 2; i < 1000; i++) {
      for (int j = 2; j < i; j++) {
          if (i % j == 0)
              continue outer;
      }
      System.out.println (i);
  }

A Java compiler might translate the Java code above into byte code as follows, 
assuming the above was put in a method:

  0:   iconst_2
  1:   istore_1
  2:   iload_1
  3:   sipush  1000
  6:   if_icmpge       44
  9:   iconst_2
  10:  istore_2
  11:  iload_2
  12:  iload_1
  13:  if_icmpge       31
  16:  iload_1
  17:  iload_2
  18:  irem
  19:  ifne    25
  22:  goto    38
  25:  iinc    2, 1
  28:  goto    11
  31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return
  1. 我不明白bytecode.的一行,如果不是全部,我想了解它的某些部分。或者这些线中的一些是什么意思,比如iconst_2
  2. bytecode.class文件相同或.class文件包含bytecode?。下面的图片显示.classbytecode都是一样的
  3. 如果它们不同,bytecode如何从.class文件中提取JVM

SO中的一些帖子总体上讨论了bytecode,但我没有看到任何解释classand bytecode(如果有的话)和如何将bytecode内容作为用户(而不是JVM)之间的关系解释的帖子。

java bytecode .class-file
3个回答
4
投票

有时我发现有一种假设,当它不是时,它必须非常复杂。它实际上非常简单。

我不理解字节码的单行。如果不是全部,我想了解它的某些部分。或者这些行中的一些含义如iconst_2?

iconst_2代表整数常量2

是字节码和.class文件相同或.class文件包含字节码?

.class包含多个字节代码。它还包含一些常数,例如字符串文字和大型基元。但是,您可以将它们视为同一个。

下图显示.class和字节码都相同

该图是简化视图。简单来说,它们是一回事。

如果它们不同,JVM如何从.class文件中提取字节码?

.class有一个specific format,如果您遵循该格式,您将找到字节代码。正如您所看到的,文件中不仅包含字节代码,而且字节代码是您应该关注的唯一位。 (实际上你不应该在99%的情况下真正关心字节码)

从上面链接的类文件格式。

类文件由单个ClassFile结构组成:

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
}

1
投票

了解字节码和类文件格式的最佳方法是只读取JVM规范。它是免费在线提供的,并不难理解(你可以跳过所有的Prolog垃圾)。这就是我开始的方式。在那之后,这只是一个练习和探索的问题。您可以通过编译和反汇编各种类来了解它在实践中的用法。

从技术上讲,字节码只是指代码属性中的实际指令,但没有其余的类文件它几乎没有意义,所以通常当我说字节码时,我指的是整个类文件格式。

我还从在Krakatau汇编程序中编写字节码的角度编写了一个字节码教程。不幸的是,它并没有走得太远,因为我因为缺乏兴趣而停止写作,但它可能仍然有用。你可以找到它here


0
投票

我可以推荐一本书“计算机组成和汇编语言原理”:

今天即将到来的学生比以往任何时候都更容易接触Java。本文着重于现代架构(Java虚拟机或JVM),在当今的便携式计算机环境中提供了对计算机组织原理的全面处理。学生将获得简单但实际的例子,以全面了解计算机在这种机器上的工作原理。 Juola使这些材料在二年级CS学生通常很难的课程中变得有用和相关。

© www.soinside.com 2019 - 2024. All rights reserved.