Hay una biblioteca que llama a mi método con algunos argumentos. Me gustaría recibir otro argumento, pero la biblioteca no lo proporciona al método al que llama.
Al descompilar la biblioteca, puedo ver que tiene el argumento y está asignada a una variable de instancia (no privada, pero tampoco pública). Sé que puedo acceder a la variable usando la reflexión si tengo la instancia, pero no Tampoco tengo la instancia.
¿Hay alguna manera de que pueda llegar a la instancia? SecurityManager tiene getClassContext() , pero eso solo me da la clase de la instancia; quiero la instancia en sí.
Como un ejemplo rápido de lo que quiero:
public class A { int b; public A(int b, int c) { this.b = b; D(c); } } public class D { public D(int c) { // Somehow I want to get at the calling instance of A's b from here, // and A belongs to a library which I didn't write. } } Alternativamente... Sé que b se usó como argumento en la pila de llamadas. Entonces, si alguien sabe cómo puedo acceder a la b que se pasó al constructor de A , eso sería aceptable.
Si ninguno de estos es factible ... Puedo descompilar A y compilarlo de la manera que quiero, y luego necesitaría hacer algo de magia de carga de clases o tendría que modificar el contenido del contenedor. Ninguno de los dos suena deseable, así que espero que alguien sepa cómo acceder a la instancia de A o al argumento b desde la pila de llamadas.
Con la ayuda del código que proporcionó, podría pensar en escribir un aspecto, me refiero a usar aop e intentar usar el punto de unión para obtener los argumentos que se pasan al constructor A()
De alguna manera quiero llegar a la instancia de llamada de A's b desde aquí
Respuesta corta: no puedes.
Respuesta larga: puede obtenerlo si lo ejecuta en un depurador o en su propia JVM personalizada.
Otra solución más: use programación orientada a aspectos con un marco como AspectJ
Usted no puede hacer eso. Vea esta publicación para más detalles.
No existe tal cosa como un 'propietario', por lo que no puede obtener la instancia de llamada, a menos que se especifique una referencia explícita al padre:
class A { int b; A(int b, int c) { this.b = b; new D(this, c); } } class D { D(A a, int c) { ... } }Parece que, de acuerdo con la biblioteca, no se supone que obtenga dicha instancia, o está mal diseñada.