这存储在类的“常数池”中(以及其他所有内容,类和方法名称等)。
您将使用Javap以可读格式查看字节码。
从那里示例上课的示例:
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
通过恒定池AS:
- Getfield#2
- 其中#2是一个字段,引用#3。#18
- 其中#3正在引用#19类
- 这是班级
Foo
- 这是班级
- #18是nameandtype引用#5和#6
- #5是栏(字段)
- #6是
java.lang.String
- 其中#3正在引用#19类
我强烈建议阅读安东的博客。真的做得很好!
我也读 James D. Bloom的JVM内部文章 因为它涵盖了许多JVM内部体系结构。随着事物的变化,请注意所引用的日期和版本(例如Java 8中的Java堆和字符串内部的使用。