Почему в LocalVariableTable нет записи для объекта внешнего класса во внутреннем конструкторе класса (байт-код Java)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему в LocalVariableTable нет записи для объекта внешнего класса во внутреннем конструкторе класса (байт-код Java)

Сообщение Anonymous »

Шаг 1. Я скомпилировал следующий код:

public class OuterClass {
class InnerClass{

}
}


У меня есть OuterClass.class и OterClass$InnerClass.class

Шаг 2: я использую javap для проверки байт-код внутреннего класса. Очень странно, что метод конструктора использует «1: aload_1», но в LocalVariableTable есть только одна запись для «this», доступная aload_0. Я предполагаю, что aload_1 предназначен для загрузки передаваемого параметра, который является ссылкой на объект внешнего класса, в вершину стека.

Мой вопрос: Почему компилятор не создает для него запись (ссылку на внешний класс, передаваемую конструктору)?

Я пробовал с Jsdk 1.4 и openjdk 1.6.

~$ javap -v -c OuterClass\$InnerClass
Compiled from "OuterClass.java"
class OuterClass$InnerClass extends java.lang.Object
SourceFile: "OuterClass.java"
InnerClass:
#24= #1 of #22; //InnerClass=class OuterClass$InnerClass of class OuterClass
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // OuterClass$InnerClass
const #2 = Asciz OuterClass$InnerClass;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz this$0;
const #6 = Asciz LOuterClass;;
const #7 = Asciz ;
const #8 = Asciz (LOuterClass;)V;
const #9 = Asciz Code;
const #10 = Field #1.#11; // OuterClass$InnerClass.this$0:LOuterClass;
const #11 = NameAndType #5:#6;// this$0:LOuterClass;
const #12 = Method #3.#13; // java/lang/Object."":()V
const #13 = NameAndType #7:#14;// "":()V
const #14 = Asciz ()V;
const #15 = Asciz LineNumberTable;
const #16 = Asciz LocalVariableTable;
const #17 = Asciz this;
const #18 = Asciz LOuterClass$InnerClass;;
const #19 = Asciz SourceFile;
const #20 = Asciz OuterClass.java;
const #21 = Asciz InnerClasses;
const #22 = class #23; // OuterClass
const #23 = Asciz OuterClass;
const #24 = Asciz InnerClass;

{
final OuterClass this$0;

OuterClass$InnerClass(OuterClass);
Code:
Stack=2, Locals=2, Args_size=2
0: aload_0
1: aload_1
2: putfield #10; //Field this$0:LOuterClass;
5: aload_0
6: invokespecial #12; //Method java/lang/Object."":()V
9: return
LineNumberTable:
line 3: 0

LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this LOuterClass$InnerClass;

}


Подробнее здесь: https://stackoverflow.com/questions/100 ... in-an-inne
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»