Ceci est stocké dans le "pool constant" de la classe (ainsi que tout le reste, les classes et les noms de méthodes, etc.).
Vous utiliseriez Javap pour regarder le bytecode dans un format lisible.
Voir L'excellent blog d'Anton Aripov sur les principes fondamentaux du bytecode
Un exemple pris à partir de là pour la classe:
public class Foo {
private String bar;
public String getBar(){
return bar;
}
...
... donne Bytecode:
public java.lang.String getBar();
Code:
0: aload_0
1: getfield #2; //Field bar:Ljava/lang/String;
4: areturn
Et a une piscine constante:
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;
Vous pouvez tracer la référence à String
de Foo#getBar
à travers la piscine constante comme:
- Getfield # 2
- où n ° 2 est un champ, faisant référence # 3. # 18
- où n ° 3 fait référence à la classe n ° 19
- qui est la classe
Foo
- qui est la classe
- et # 18 est un référencement de type Namead # 5 et # 6
- et # 5 est Bar (champ)
- et # 6 est la référence à
java.lang.String
- où n ° 3 fait référence à la classe n ° 19
Je conseille fortement de lire le blog d'Anton. C'est vraiment bien fait!
Je lirais aussi Article JVM internes de James D. Bloom car il couvre beaucoup d'architecture interne JVM. Soyez conscient des dates et des versions référencées à mesure que les choses changent (comme l'utilisation du tas Java dans Java 8 et la chaîne.