문제

그곳에서 편집 된 클래스의 섹션 다른 클래스 (가져 오기)에 대한 종속성은 저장되었으며 (편집자 또는 프로그래밍 방식이 아닌) 볼 수 있습니까?

감사,

도움이 되었습니까?

해결책

이것은 클래스의 "상수 풀"에 저장됩니다 (다른 모든 것, 클래스 및 메소드 이름 등).

Javap을 사용하여 바이트 코드를 읽을 수있는 형식으로보십시오.

보다 Bytecode 기초에 대한 Anton Arhipov의 훌륭한 블로그

수업을 위해 거기에서 가져온 예 :

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은 #5 및 #6을 참조하는 nameandtype입니다.
      • 그리고 #5는 바 (필드)입니다.
      • 그리고 #6은 다음에 대한 참조입니다 java.lang.String

Anton의 블로그를 읽는 것이 좋습니다. 정말 잘 했어요!

나는 또한 읽을 것이다 James D. Bloom의 JVM 내부 기사 많은 JVM 내부 아키텍처를 다루고 있습니다. 사물이 바뀌면서 언급 된 날짜와 버전을 알고 있어야합니다 (예 : Java 8의 Java 힙 사용 및 문자열은 Inlining이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top