이것은 클래스의 "상수 풀"에 저장됩니다 (다른 모든 것, 클래스 및 메소드 이름 등).
Javap을 사용하여 바이트 코드를 읽을 수있는 형식으로보십시오.
보다 Bytecode 기초에 대한 Anton Arhipov의 훌륭한 블로그
수업을 위해 거기에서 가져온 예 :
public class Foo {
private String bar;
public String getBar(){
return bar;
}
...
... 바이트 코드를 생성합니다.
public java.lang.String getBar();
Code:
0: aload_0
1: getfield #2; //Field bar:Ljava/lang/String;
4: areturn
그리고 일정한 수영장이 있습니다.
Compiled from "Foo.java"
public class Foo extends java.lang.Object
SourceFile: "Foo.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#17; // java/lang/Object."<init>":()V
const #2 = Field #3.#18; // Foo.bar:Ljava/lang/String;
const #3 = class #19; // Foo
const #4 = class #20; // java/lang/Object
const #5 = Asciz bar;
const #6 = Asciz Ljava/lang/String;;
const #7 = Asciz <init>
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz getBar;
const #12 = Asciz ()Ljava/lang/String;;
const #13 = Asciz setBar;
const #14 = Asciz (Ljava/lang/String;)V;
const #15 = Asciz SourceFile;
const #16 = Asciz Foo.java;
const #17 = NameAndType #7:#8;// "<init>":()V
const #18 = NameAndType #5:#6;// bar:Ljava/lang/String;
const #19 = Asciz Foo;
const #20 = Asciz java/lang/Object;
참조를 추적 할 수 있습니다 String
~에서 Foo#getBar
상수 수영장을 통해 :
- Getfield #2
- 여기서 #2는 필드, 참조 #3. #18
- 여기서 #3은 클래스 #19를 참조합니다
- 클래스입니다
Foo
- 클래스입니다
- 그리고 #18은 #5 및 #6을 참조하는 nameandtype입니다.
- 그리고 #5는 바 (필드)입니다.
- 그리고 #6은 다음에 대한 참조입니다
java.lang.String
- 여기서 #3은 클래스 #19를 참조합니다
Anton의 블로그를 읽는 것이 좋습니다. 정말 잘 했어요!
나는 또한 읽을 것이다 James D. Bloom의 JVM 내부 기사 많은 JVM 내부 아키텍처를 다루고 있습니다. 사물이 바뀌면서 언급 된 날짜와 버전을 알고 있어야합니다 (예 : Java 8의 Java 힙 사용 및 문자열은 Inlining이 있습니다.