5 Stimmen

Java: Rufen Sie dies für Methoden oberhalb des Stacks ab

Wie erhält man einen Verweis auf eine ausführende Klasse, die mehrere Stackframes über der aktuellen Klasse liegt? Zum Beispiel, wenn Sie haben:

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

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

Gibt es eine Möglichkeit, den Wert zu erhalten, der durch die Verwendung von 'this' in foo() abgerufen werden würde, während der Thread bar() ausführt?

0 Stimmen

Es klingt für mich so, als ob Sie versuchen, damit ein bestimmtes Problem zu lösen. Können Sie uns sagen, welches Problem Sie tatsächlich zu lösen versuchen? Für das eigentliche Problem gibt es wahrscheinlich eine einfachere Lösung.

0 Stimmen

@matt b: ich wollte gerade diesen Kommentar schreiben

1voto

sblundy Punkte 59298

Nein, das kann man nicht. In allen mir bekannten Sprachen, die einen Stack verwenden, ist der Inhalt anderer Stack-Frames vor Ihnen verborgen. Es gibt ein paar Dinge, die Sie tun können, um es zu bekommen, abgesehen von der offensichtlichen Übergabe als Parameter. Eines der aspektorientierten Frameworks könnte Ihnen etwas liefern. Außerdem können Sie ein paar Debugging-Informationen von [Thread.getStackTrace()](http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getStackTrace()) .

1 Stimmen

In Smallalk gibt Ihnen thisContext einen Zugriff auf den Stack. Sie können den Stack auf jede beliebige Weise manipulieren. Dies wird z. B. in Seaside (dem Webapp-Framework) verwendet, um Fortsetzungen zu implementieren und so den gesamten Ablauf vieler Webseiten oder sogar der gesamten Website in einer Methode zu realisieren!

1voto

SCdF Punkte 53953

Wie andere Leute gesagt haben, werden Sie wollen, dass Ihre untere Methode die Klasseninstanz der höheren Methode übergeben bekommt und sie auf diese Weise erhalten.

z.B.:

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

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

1voto

Bill Michell Punkte 8050

Sie haben drei Auswahlmöglichkeiten. Sie können das aufrufende Objekt an die Bar-Methode übergeben:

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

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

Oder Sie können die Klasse B zu einer inneren Klasse der Klasse A machen:

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

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

Wenn Sie nur die Klasse und nicht die Objektinstanz benötigen, haben Sie eine dritte Möglichkeit. Durch die Verwendung von Thread.currentThread().getStackTrace() können Sie den qualifizierten Namen einer Klasse an einer beliebigen Stelle im Stapel abrufen und mit Hilfe von Reflection die Klasseninstanz erhalten. Aber das ist so schrecklich, dass Sie entweder Ihr Design korrigieren sollten oder (wenn Sie Ihren eigenen Debugger oder etwas ähnliches schreiben) ein einfacheres Projekt versuchen sollten, bis Sie genug über Java wissen, um diese Art von Dingen selbst herauszufinden...

0voto

matt b Punkte 135206

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

0 Stimmen

Ich hatte ein Problem, die Frage zu verstehen, aber ich denke, er will wissen, ob er den Verweis auf A (den er bekommen hätte, wenn er "dies" verwendet hätte) irgendwie bekommen könnte, während er in der Bar ist.

0voto

Uri Punkte 86472

Ich denke, dass Java-Methoden im Allgemeinen nicht direkt auf den Aufrufstapel zugreifen dürfen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X