I'm using Spring, at one point I would like to cast the object to its actual runtime implementation.
Example:
Class MyClass extends NotMyClass {
InterfaceA a;
InterfaceA getA() { return a; }
myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}
That yells a ClassCastException
since a
is a $ProxyN
object. Although in the beans.xml I injected a bean which is of the class ImplementationOfA
.
EDIT 1
I extended a class and I need to call for a method in ImplementationOfA
. So I think I need to cast. The method receives a parameter.
EDIT 2
I better rip off the target class:
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
}
I know it is not very elegant but works.
All credits to http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/ Thank you!
For me version from EDIT 2 didn't worked. Below one worked:
@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy) throws Exception {
while( (AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget());
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
Usage:
UserServicesImpl serviceImpl = getTargetObject(serviceProxy);
serviceImpl.setUserDao(userDAO);
Now you can use
AopTestUtils.getTargetObject(proxy)
.
The implementation is the same of @siulkilulki sugestion, but it's on Spring helper
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With