0

Eclipse和JDK编译的字节码是不同的。那么JVM是如何理解这两个字节码的呢?例子:

package com.hcl.raj.utilities;

public class StringTest {

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    String name = "Rajkumar";
    byte[] byteCodes = new byte[] {15,22,35,48};
    String str1 = new String(byteCodes);
    System.out.println(str1);
  }
}

以上源码通过JDK和Eclipse编译出来的代码是不同的。

由于编码和格式问题,最初尝试发布已删除的已编译代码

4

4 回答 4

4

首先,是字节码不同,还是仅在类文件的其他部分有所不同?一个类文件可以包含很多可选信息(用于调试)。

但即使字节码本身不同,它们的行为也像同义词。即使在像 Java 字节码这样严格定义的语言中,您也可以用不同的方式表达相同的行为。

例如,switch/case语句可以编译成两种不同的操作码之一:tableswitchlookupswitch. 它们本质上都做同样的事情,因此在某些情况下,编译器或多或少可以自由地在它们之间进行选择。

重要的是,尽管这些差异都在标准字节码的限制范围内,但无论平台或任何其他外部环境如何,没有兼容 Java 的编译器会生成类似兼容的 VM 无法解释的字节码(假设它们支持相同版本的爪哇)。

于 2012-08-21T10:49:36.003 回答
3

JLS 中有一个很大的章节专门用于指定 Java 类文件格式,这确实是首先拥有该格式的全部意义所在。javac编译器对其恰好生成的文件的格式没有特殊权限。

于 2012-08-21T11:02:02.483 回答
2

Eclipse 在内部使用一个 SDK(它可以与您用来直接生成字节码的相同,也可以是另一个)。此外,不同的 SDK 可以生成不同的 Bytecode(例如,如果 JDK 来自不同的公司或不同的版本),但如果它们在生成字节码时满足字节码规范,它们将被同样遵循该规范的 JVM 很好地解释.

于 2012-08-21T10:58:17.357 回答
0

Java 字节码是可移植的,这是 Java 的关键特性之一。你可以在这里阅读一些信息。如果您想了解这种可移植性究竟是如何工作的,您可以浏览规范。

于 2012-08-21T10:48:13.323 回答