Pergunta

No qual Seção de uma classe compilada As dependências para outras classes (as importações) são armazenadas e elas podem ser visualizadas (com um editor ou algo não programaticamente)?

Obrigado,

Foi útil?

Solução

Isso é armazenado no "pool constante" da classe (junto com tudo o mais, classes e nomes de métodos, etc.).

Você usaria o Javap para olhar para o bytecode em um formato legível.

Ver O excelente blog de Anton Arhopov nos fundamentos do bytecode

Um exemplo tirado de lá para a aula:

public class Foo {
    private String bar;

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

... produz bytecode:

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

E tem 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;

Você pode rastrear a referência a String a partir de Foo#getBar através da piscina constante como:

  • Getfield #2
  • onde #2 é um campo, referenciando #3. #18
    • onde #3 está referenciando a classe 19
      • qual é a classe Foo
    • e o #18 é um referenciamento de NameAndType #5 e #6
      • e #5 é bar (campo)
      • e #6 é a referência a java.lang.String

Eu aconselho fortemente a leitura do blog de Anton. Está muito bem feito!

Eu também li Artigo de JVM de James D. Bloom Como abrange muita arquitetura interna da JVM. Esteja ciente das datas e versões referenciadas à medida que as coisas mudam (como o uso da pilha Java em Java 8 e String Inlining.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top