Estoy usando Spring, en un punto me gustaría convertir el objeto a su implementación real en tiempo de ejecución.Transmitiendo un objeto Proxy de Spring a la clase de tiempo de ejecución real
Ejemplo:
Class MyClass extends NotMyClass {
InterfaceA a;
InterfaceA getA() { return a; }
myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}
Eso grita un ClassCastException
desde a
es un objeto de $ProxyN
. Aunque en beans.xml inyecté un bean que es de la clase ImplementationOfA
.
EDIT 1 me extendió una clase y tengo que llamar a un método en el ImplementationOfA
. Entonces creo que necesito lanzar. El método recibe un parámetro.
EDIT 2
Será mejor arranco la clase de destino:
private T getTargetObject(Object proxy, Class targetClass) throws Exception {
while((AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget(), targetClass);
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
Sé que no es muy elegante, pero funciona.
Todos los créditos a http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/ ¡Gracias!
Esta es una mala práctica, la clase de implementación real no debería ser relevante. Sin embargo, es posible, dependiendo de cómo se crea su proxy. – skaffman
Si necesita llamar a un método en 'ImplementationOfA', entonces agregue ese método a la interfaz' InterfaceA', o defina una segunda interfaz y agregue el método a eso. – skaffman
Bueno, sé que no es ideal, pero la clase que estoy implementando implementa una interfaz, y debido a los requisitos de la aplicación no puedo modificar InterfaceA ni NotMyClass. – ssedano