ソースコードでこれをすべて確認しようとしています--それがそれらのネイティブの1つではない場合.
それは可能な限りネイティブであり、「この文字列リテラルをロードする」ためのバイトコード操作を持つ JVM によって処理されます。
次のコードを使用します。
public class StringLiterals {
public static void main(String[] args) {
String s = "hello, world";
}
}
これをコンパイルして実行すると、次のようjavap -c StringLiterals
になります。
Compiled from "StringLiterals.java"
public class StringLiterals extends java.lang.Object{
public StringLiterals();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String hello, world
2: astore_1
3: return
}
2 番目のコード0
とは;1
に対応するものです。String s = "hello, world"
コード0
は文字列リテラルに対応します"hello, world"
。ファイルにconst #2 をロードするように指示.class
し、それが文字列literalであることを示唆していますhello, world
。実行javap -c -verbose StringLiterals
すると、ファイルで定義されているすべての const が表示され、.class
2 番目の const がその文字列リテラルであることが確認されます。
Compiled from "StringLiterals.java"
public class StringLiterals extends java.lang.Object
SourceFile: "StringLiterals.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#13; // java/lang/Object."<init>":()V
const #2 = String #14; // hello, world
const #3 = class #15; // StringLiterals
...
JVM はこれを自由に処理できますが、openjdk はネイティブで処理するため、Java ソースに関連するコードは表示されません。