How do I get the underlying type of a proxy object in java?
Well a Proxy instance won't be an instance of java.lang.reflect.Proxy
per se. Rather, it will be an instance of a subclass of java.lang.reflect.Proxy
.
Anyway, the way to get the actual proxy classes name is:
Proxy proxy = ...
System.err.println("Proxy class name is " + proxy.getClass().getCanonicalName());
However, you cannot get the name of the class that the Proxy is a proxy for, because:
- you proxy interfaces not classes, and
- a Proxy can be a proxy for multiple interfaces
However, from looking at the source code of the ProxyGenerator
class, it seems that the interfaces are recorded in the generated proxy class as the interfaces of the class. So you should be able to get them at runtime via the proxy classes Class
object; e.g.
Class<?>[] classes = proxy.getClass().getInterfaces();
(Note: I've not tried this ...)
I found a good solution on this site (now archived):
@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
if (AopUtils.isJdkDynamicProxy(proxy)) {
return (T) ((Advised)proxy).getTargetSource().getTarget();
} else {
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
}
Usage
@Override
protected void onSetUp() throws Exception {
getTargetObject(fooBean, FooBeanImpl.class).setBarRepository(new MyStubBarRepository());
}
You can get the InvocationHandler
with which the proxy was created, by calling Proxy.getInvocationHandler(proxy)
Note that in the case of java.lang.reflect.Proxy
there is no underlying class per se. The proxy is defined by:
- interface(s)
- invocation handler
And the wrapped class is usually passed to the concrete invocation handler.