Domanda

In quale sezione di una classe compilata Le dipendenze di altre classi (le importazioni) sono memorizzate e possono essere visualizzate (con un editor o qualcosa di non programmaticamente)?

Grazie,

È stato utile?

Soluzione

Questo è memorizzato nel "pool costante" della classe (insieme a tutto il resto, classi e nomi di metodi, ecc.).

Utilizzeresti Javap per guardare il bytecode in un formato leggibile.

Vedere L'eccellente blog di Anton Arhipov sui fondamentali bytecode

Un esempio preso da lì per la lezione:

public class Foo {
    private String bar;

    public String getBar(){ 
      return bar; 
    }
    ...

... resa bytecode:

public java.lang.String getBar();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field bar:Ljava/lang/String;
   4:   areturn

E ha una piscina costante:

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;

Puoi rintracciare il riferimento a String da Foo#getBar attraverso la piscina costante come:

  • Getfield #2
  • dove #2 è un campo, riferendosi #3. #18
    • dove #3 fa riferimento alla classe #19
      • che è classe Foo
    • e #18 è un nameandtype che fa riferimento #5 e #6
      • e #5 è bar (campo)
      • e #6 è il riferimento a java.lang.String

Consiglio vivamente a leggere il blog di Anton. È davvero ben fatto!

Ho anche letto L'articolo interno di James D. Bloom JVM poiché copre molta architettura interna JVM. Sii consapevole delle date e delle versioni citate sebbene le cose cambiano (come l'uso del cumulo di Java in Java 8 e la corda in linea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top