Внутренние классы
От: ded_savely  
Дата: 13.03.06 06:54
Оценка:
Нужно написать внутренний класс, т.е. такой getDeclaringClass() которого возвращает не null.
Нужно написать на JasminXT или на Jamaica.


Например:
;------------------------------------------------------------------
;This is outer class
.source Outer.j
.class Outer
.super SomeSuperClass

.method public createrInnerClass()V
.limit stack 10
.limit locals 10

;create a Inner object
new Outer$Inner
dup
invokenonvirtual Outer$Inner/<init>(LOuterV

;test function must print a Outer class name
invokevirtual Outer$Inner/testFunction ()V
.end method


;------------------------------------------------------------------
;This is inner class
.source Outer$Inner.j
.class Outer$Inner
.super java/lang/Object

.field final this$0 LOuter;

;contructor
.method pubilc <init>(LOuterV
.limit stack 10
.limit locals 10

aload_0
invokenonvirtual Object/<init>()V

aload_0
aload_1
putfield Inner$Outer/this$0 LOuter;

return
.end method

;test
.method public testFunction ()V
.limit stack 10
.limit locals 10

;get out object
getstatic java/io/PrintStream/out java/io/PrintStream;

aload_0
invokevirtual java/lang/Object/getClass()java/lang/Class;

;now in stack Outer$Inner class
invokevirtual java/Class/getDeclaringClass()java/lang/Class;

;but now in stack null
invokevirtual java/io/PrintStream/print (Ljava/lang/ObjectV
.end method


Но getDeclaringClass () возвращает null. Я дисассемблировал реальный java код,
используя dejasmin. Он был таким же, но там всё работало.

Что я делаю не так?
Re: Внутренние классы
От: dshe  
Дата: 13.03.06 08:38
Оценка:
Здравствуйте, ded_savely, Вы писали:

_>Нужно написать внутренний класс, т.е. такой getDeclaringClass() которого возвращает не null.

_>Нужно написать на JasminXT или на Jamaica.

_>Например:


_>Но getDeclaringClass () возвращает null. Я дисассемблировал реальный java код,

_>используя dejasmin. Он был таким же, но там всё работало.

_>Что я делаю не так?


inner и outer классы должны содержать аттрибут InnerClasses
// Main.java
public class Main {
    public class Inner {
    }
}

Compiled from "Main.java"
public class Main extends java.lang.Object
  SourceFile: "Main.java"
  InnerClass: 
   public #5= #4 of #2; //Inner=class Main$Inner of class Main
const #2 = class    #14;    //  Main
const #4 = class    #16;    //  Main$Inner
const #5 = Asciz    Inner;
const #6 = Asciz    InnerClasses;

Compiled from "Main.java"
public class Main$Inner extends java.lang.Object
  SourceFile: "Main.java"
  InnerClass: 
   public #18= #3 of #16; //Inner=class Main$Inner of class Main
const #3 = class    #17;    //  Main$Inner
const #16 = class    #22;    //  Main
const #18 = Asciz    Inner;
const #19 = Asciz    InnerClasses;
--
Дмитро
Re[2]: Внутренние классы
От: ded_savely  
Дата: 14.03.06 04:31
Оценка:
Спасибо, заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.