JVM如何理解JDK和Eclipse编译的字节代码,而两者是不同的?

时间:2012-08-21 10:42:39

标签: java

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 个答案:

答案 0 :(得分:4)

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

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

例如,switch/case语句可以编译为两个不同的操作码之一:tableswitch or lookupswitch。它们本质上都做同样的事情,因此在某些情况下,编译器或多或少可以自由选择它们。

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

答案 1 :(得分:3)

JLS中有一个huge chapter专门用于指定Java类文件格式,这实际上是首先使用该格式的重点。 javac编译器对其恰好生成的文件格式没有特殊权限。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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