2008-11-27 11 views
5

¿Cómo obtendría una referencia a una clase de ejecución de varios marcos de pila por encima de la actual? Por ejemplo, si usted tiene:Java: Recupere esto para los métodos anteriores en la pila

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

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

¿Hay una manera de obtener el valor que se recupera mediante el uso de 'esto' en foo() mientras se está ejecutando el subproceso bar()?

+0

Me parece que está intentando usar esto para resolver un determinado problema. ¿Puede decirnos qué problema está tratando de resolver en realidad? Es probable que haya una solución más fácil al problema real. –

+0

@matt b: estaba a punto de publicar este comentario – Claudiu

Respuesta

1

No, no puedes. En todos los lenguajes que usan una pila que conozco, los contenidos de otros marcos de pila están ocultos para usted. Hay algunas cosas que puede hacer para obtenerlo, más allá de lo obvio pasarlo como parámetro. Uno de los frameworks orientados a aspectos puede obtener algo. Además, puedes obtener un poco de información de depuración en Thread.getStackTrace().

+1

En Smallalk, thisContext le da un manejo a la pila. Puede manipular la pila de la forma que desee. Esto se usa, por ejemplo, en Seaside (el framework webapp) para implementar continuaciones y así implementar todo el flujo de muchas páginas web o incluso todo el sitio web en un solo método. – akuhn

0

this es siempre una referencia a la instancia actual del objeto. Por lo tanto, cualquier uso de this en foo() devolverá una instancia de la Clase A.

+0

Tuve un problema para entender la pregunta, pero creo que quiere preguntar si de alguna manera podría obtener la referencia a A (que obtendría si usara "esto")) mientras estás en la barra. – Uri

0

Creo que los métodos Java en general no están autorizados para acceder directamente a la pila de llamadas.

Desde el punto de vista de la seguridad, no desearía que una función de API tenga acceso potencial a los datos de la persona que llama.

1

Como han dicho otras personas, querrá que su método inferior pase la instancia de clase del método superior y obtenerlo de esa manera.

por ejemplo:

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

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

Usted tiene tres opciones. Puede pasar el objeto de poner en el método de barras:

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

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

O bien, puede hacer que la clase B una clase interna de la clase A:

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

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

Si todo lo que necesita es la clase en lugar de la instancia del objeto , tienes una tercera opción. Mediante el uso de Thread.currentThread().getStackTrace(), puede obtener el nombre completo de una clase en un punto arbitrario de la pila y usar el reflejo para obtener la instancia de la clase. Pero eso es tan horrible, deberías arreglar tu diseño, o (si estás escribiendo tu propio depurador o algo similar) intenta un proyecto más simple hasta que sepas lo suficiente sobre Java para resolver este tipo de cosas por ti mismo ...

Cuestiones relacionadas