Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Casting a Spring's Proxy object to the actual runtime class

Tags:

java

spring

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!

like image 967
ssedano Avatar asked May 12 '11 09:05

ssedano


2 Answers

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);
like image 108
siulkilulki Avatar answered Sep 19 '22 16:09

siulkilulki


Now you can use

AopTestUtils.getTargetObject(proxy)
.

The implementation is the same of @siulkilulki sugestion, but it's on Spring helper

like image 27
Roberto Rosin Avatar answered Sep 18 '22 16:09

Roberto Rosin