2008-11-27 5 views
5

Wie erhalten Sie einen Verweis auf eine ausführende Klasse mehrere Stapelrahmen über dem aktuellen? Zum Beispiel, wenn Sie haben:Java: Abrufen dieser für Methoden oben im Stapel

Class a { 
    foo() { 
     new b().bar(); 
    } 
} 

Class b { 
    bar() { 
     ... 
    } 
} 

Gibt es einen Weg, um den Wert zu erhalten, die mit ‚this‘ in foo(), während der Thread ausgeführt wird bar abgerufen werden würde()?

+0

Es klingt für mich wie Sie versuchen, dies zu verwenden, um ein bestimmtes Problem zu lösen. Können Sie uns sagen, welches Problem Sie eigentlich lösen wollen? Es ist wahrscheinlich eine einfachere Lösung für das eigentliche Problem. –

+0

@matt b: Ich war gerade dabei, nur diesen Kommentar zu posten – Claudiu

Antwort

1

Nein, das geht nicht. In allen Sprachen, die einen mir bekannten Stack verwenden, sind die Inhalte anderer Stack-Frames für Sie unsichtbar. Es gibt ein paar Dinge, die Sie tun können, um es zu bekommen, jenseits der offensichtlichen Weitergabe als Parameter. Eines der aspektorientierten Frameworks könnte Ihnen etwas bringen. Außerdem können Sie ein paar Debugging-Informationen von Thread.getStackTrace() bekommen.

+1

In Smallall gibt thisContext Ihnen einen Griff zum Stapel. Sie können den Stapel beliebig manipulieren. Dies wird zB in Seaside (dem Webapp-Framework) verwendet, um Fortsetzungen zu implementieren und somit den gesamten Fluss von vielen Webseiten oder sogar die gesamte Webseite in einer Methode zu implementieren! – akuhn

0

this ist immer ein Verweis auf die aktuelle Instanz des Objekts. Also jede Verwendung von this in foo() wird eine Instanz der Klasse A zurückgeben.

+0

Ich hatte ein Problem, die Frage zu verstehen, aber ich denke, er meint zu fragen, ob er irgendwie den Bezug zu A bekommen könnte (was er bekommen würde, wenn er "dieses" benutzt hätte)) während in der Bar. – Uri

0

Ich denke, dass Java-Methoden in der Regel nicht direkt auf den Aufruf-Stack zugreifen dürfen.

Aus Sicherheitsgründen möchten Sie nicht, dass eine API-Funktion auf die Daten des Aufrufers zugreift.

1

Wie andere Leute gesagt haben, wollen Sie, dass Ihre niedrigere Methode die Klasseninstanz der höheren Methode passiert und es so bekommt.

z:

Class A { 
    foo() { 
     new b().bar(this); 
    } 
} 

Class B { 
    bar(A aInstance) { 
     ... 
    } 
} 
1

Sie haben drei Möglichkeiten. Sie können das anrufende Objekt in der Bar-Methode übergeben:

Class A { 
    foo() { 
     new B().bar(this); 
    } 
} 

Class B { 
    bar(A caller) { 
     ... 
    } 
} 

Oder Sie können die Klasse B eine innere Klasse der Klasse A machen:

Class A { 
    foo() { 
     new B().bar(); 
    } 

    Class B { 
     bar() { 
      A caller=A.this; 
      ... 
     } 
    } 
} 

Wenn alles, was Sie die Klasse brauchen, ist eher als die Objektinstanz , Sie haben eine dritte Wahl. Wenn Sie verwenden, können Sie den qualifizierten Namen einer Klasse an einem beliebigen Punkt im Stapel abrufen und mithilfe von Reflection die Klasseninstanz abrufen. Aber das ist so schrecklich, Sie sollten entweder Ihr Design reparieren, oder (wenn Sie Ihren eigenen Debugger oder etwas ähnliches schreiben) versuchen Sie ein einfacheres Projekt, bis Sie genug über Java wissen, um diese Art von Sache für sich selbst herauszufinden ...

Verwandte Themen