Java: получить это для методов выше в стеке - PullRequest
5 голосов
/ 27 ноября 2008

Как бы вы получили ссылку на исполняемый класс на несколько кадров стека выше текущего? Например, если у вас есть:

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

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

Есть ли способ получить значение, которое будет получено с помощью 'this' в foo (), когда поток выполняет bar ()?

Ответы [ 5 ]

1 голос
/ 27 ноября 2008

У вас есть три варианта. Вы можете передать вызывающий объект в метод bar:

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

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

Или вы можете сделать класс B внутренним классом класса A:

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

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

Если вам нужен только класс, а не экземпляр объекта, у вас есть третий выбор. Используя Thread.currentThread().getStackTrace(), вы можете получить полное имя класса в произвольной точке стека и использовать отражение для получения экземпляра класса. Но это так ужасно, вы должны либо исправить свой дизайн, либо (если вы пишете свой собственный отладчик или что-то подобное) попробовать более простой проект, пока вы не узнаете достаточно о Java, чтобы выяснить подобные вещи для себя ... *

1 голос
/ 27 ноября 2008

Как уже говорили другие люди, вы хотите, чтобы ваш метод более низкого уровня был передан экземпляру класса более высокого метода и получил его таким образом.

например:

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

Class B {
    bar(A aInstance) {
        ...
    }
}
1 голос
/ 27 ноября 2008

Нет, вы не можете. На всех языках, которые используют стек, который я знаю, содержимое других фреймов стека скрыто от вас. Есть несколько вещей, которые вы можете сделать, чтобы получить его, кроме очевидной передачи его в качестве параметра. Одна из аспектно-ориентированных структур может вам кое-что дать. Кроме того, вы можете получить немного отладочной информации от Thread.getStackTrace().

0 голосов
/ 27 ноября 2008

Я думаю, что методы Java, как правило, не имеют прямого доступа к стеку вызовов.

С точки зрения безопасности вам не нужно, чтобы функция API потенциально обеспечивала доступ к данным вызывающего абонента.

0 голосов
/ 27 ноября 2008

this всегда является ссылкой на текущий экземпляр объекта. Таким образом, любое использование this в foo() вернет экземпляр класса A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...