La Web del Programador: Comunidad de Programadores
 
    Pregunta:  49349 - ACCESO DESDE CLASES ESTÁTICAS
Autor:  Sergio perez
Buenas a todos:

Os cuento la duda que tengo: Hay un objeto A definido "normalmente", con su constructor, metodos, atributos, etc. Ese objeto hace llamadas a metodos de una clase estática B.

Hay alguna forma posible de que B lea atributos de A sin que se le pasen por parámetro? Es decir, si A tiene un atributo llamado aux, B tiene que leerlo sin que se le pase por parámetro ni el atributo ni el objeto A.

¿Hay alguna forma de conocer dentro de que objeto está instanciado otro y tener una referencia a él? clausula como super. no me valen porque no están relacionados por herencia, ni instanceof porque me interesa el objeto en sí, no la clase que instancia para poder leer el valor de una variable.

MUCHAS GRACIAS A TODOS

  Respuesta:  Leo Lobeto
Si entiendo bien tu problema, lo que necesitarías es, en el método de la clase B, poder preguntar quién es el objeto llamador. Si pudieras identificar el llamador podrías leer el valor de los atributos de A en el método de B.

No hay forma de hacer eso en Java. Tal funcionalidad representaría una violación al paradigma. El método de B solo podría ser invocado por un objeto de la clase de A, que tenga el atributo aux. La idea tras la programación orientada a objetos es que cada objeto sea independiente del resto para posibilitar el máximo reuso. Además, si B requiere acceder a las propiedades de A ¿por qué no es un argumento en la invocación? Probablemente el método en cuestión está alojado en la clase incorrecta.

Si tu intención es ahorrar en la cantidad de parámetros que tiene el método, la solución es crear un DTO (data transfer object), un objeto que contenga todo lo que B necesita para operar. A debería llenarlo y mandárselo como único argumento.

Si lo que intentas es proteger a A, es decir, si no envías a A como argumento para no exponerlo ante B, o no deseas que B tome un parámetro de una clase tan específica, lo que debes hacer es crear una interfaz. Esto se hace comunmente para la notificación de eventos. Existiría una interfaz, llamémosle C, con el método getAux() y harías que B tome como parámetro un objeto de tipo C y que A implemente C. Al invocar al método de B, el objeto A le pasaría this como parámetro, y B solo tendría disponible el método que le interesa: getAux().

Si estás convencido de que necesitas acceder al objeto llamador de todos modos, estoy casi seguro de que no hay manera de hacerlo. En todo caso puedes investigar por el lado del StackTrace de las excepciones. Puedes conocer la cadena de llamadas haciendo:

(new Throwable()).getStackTrace()

No creo que obtengas más que la clase del objeto que te llamó y el nombre del método que se estaba ejecutando.

Saludos.