Pregunta

En el cual Sección de una clase compilada ¿Se almacenan dependencias a otras clases (las importaciones) y se pueden ver (con un editor o algo no programáticamente)?

Gracias,

¿Fue útil?

Solución

Esto se almacena en el "grupo constante" de la clase (junto con todo lo demás, clases y nombres de métodos, etc.).

Usaría Javap para mirar el Bytecode en un formato legible.

Ver El excelente blog de Anton Arhotov sobre Bytecode Fundaments

Un ejemplo tomado de allí para la clase:

public class Foo {
    private String bar;

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

... produce bytecode:

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

Y tiene una piscina 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;

Puede rastrear la referencia a String de Foo#getBar a través de la piscina constante como:

  • Getfield #2
  • donde #2 es un campo, haciendo referencia al #3. #18
    • donde #3 está haciendo referencia a la clase #19
      • que es clase Foo
    • y #18 es una referencia de NameAndtype #5 y #6
      • y #5 es bar (campo)
      • y #6 es la referencia a java.lang.String

Aconsejo leer el blog de Anton. ¡Está realmente bien hecho!

También leí Artículo interno JVM de James D. Bloom ya que cubre mucha arquitectura interna JVM. Sin embargo, tenga en cuenta las fechas y las versiones a las referenciadas a medida que cambian las cosas (como el uso del montón de Java en Java 8 y en la incrustación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top