2008-11-27 1 views
5

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

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

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

Есть ли способ, чтобы получить значение, которое будет извлекаться с помощью «это» в Foo() в то время как поток выполняет бар()?

+0

Это звучит так, как будто вы пытаетесь использовать это, чтобы решить определенную проблему. Можете ли вы рассказать нам, какую проблему вы пытаетесь решить? Вероятнее всего, это более легкое решение реальной проблемы. – 2008-11-27 04:36:35

+0

@matt b: я собирался опубликовать только этот комментарий – Claudiu 2008-11-27 04:57:01

ответ

1

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

0

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

+0

У меня возникла проблема с пониманием вопроса, но я думаю, что он хочет спросить, может ли он каким-то образом получить ссылку на A (которую он получит, если бы использовал это ")") в то время как в баре. – Uri 2008-11-27 04:32:08

0

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

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

1

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

например:

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

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

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

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

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

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

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

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

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

Смежные вопросы