Question

Dans lequel Section d'une classe compilée Les dépendances dans d'autres classes (les importations) sont-elles stockées et peuvent-elles être consultées (avec un éditeur ou quelque chose qui n'est pas programmatique)?

Merci,

Était-ce utile?

La solution

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
    • 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

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top