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 バイトコードのように厳密に定義された言語であっても、同じ動作をさまざまな方法で表現できます。

たとえば、ステートメントは 2 つの異なるオペコードまたは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にすることができます)。また、SDKが異なれば、異なるバイトコードを生成できます(たとえば、JDKが異なる会社または異なるバージョンのものである場合)が、バイトコードを生成するときにバイトコード仕様を満たしている場合は、その仕様に準拠するJVMによって適切に解釈されます。 。

于 2012-08-21T10:58:17.357 に答える
0

Java バイトコードは移植可能です。これは Java の重要な機能の 1 つです。ここでいくつかの情報を読むことができます。この移植性が正確にどのように機能するかを知りたい場合は、仕様を閲覧できます。

于 2012-08-21T10:48:13.323 に答える