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的上述源代码的编译代码是不同的。
原始尝试发布因编码和格式问题而删除的已编译代码
答案 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。如果您想了解这种可移植性是如何工作的,您可以浏览规范。