Где зависимости хранятся в скомпилированном классе Java?

StackOverflow https://stackoverflow.com/questions/19835591

Вопрос

В котором раздел скомпилированного класса хранятся ли зависимости от других классов (импорт), и могут ли их просмотреть (с редактором или чем -то не программатически)?

Спасибо,

Это было полезно?

Решение

Это хранится в «постоянном пуле» класса (наряду со всем остальным, классы и именами методов и т. Д.).

Вы бы использовали Javap, чтобы посмотреть на байт -код в читаемом формате.

Видеть Отличный блог Антона Аррипива на основе байт -кодов

Пример, взятый оттуда для класса:

public class Foo {
    private String bar;

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

... дает байт -код:

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

И имеет постоянный бассейн:

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;

Вы можете отследить ссылку на String из Foo#getBar через постоянный бассейн как:

  • Getfield #2
  • Где #2 - поле, ссылаясь на № 3. #18
    • Где № 3 ссылается на класс № 19
      • который является классом Foo
    • и № 18 - это NamEandtype ссылка № 5 и № 6
      • и #5 - бар (поле)
      • и № 6 - это ссылка на java.lang.String

Я настоятельно советую прочитать блог Антона. Это действительно хорошо сделано!

Я также прочитал Статья Джеймса Д. Блума JVM Internals как охватывает много внутренней архитектуры JVM. Имейте в виду даты и версии, на которые ссылаются, по мере того, как все меняется (например, использование кучи Java в Java 8 и Inlining String.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top