tags:

views:

30

answers:

2

I'd like to access the classname of the underlying class which is an instance of java.lang.reflect.Proxy.

Is this possible?

+3  A: 

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.

Bozho
Thanks. What does the invocation handler get me? I've got a proxy but i want the classname of the object that is implementing the interface the proxy is built from. I'm thinking it's not possible ...
Bedwyr Humphreys
There is no object other than the proxy object. The invocation handler is responsible for dispatching the call
Bozho
+1  A: 

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:

  1. you proxy interfaces not classes, and
  2. 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 ...)

Stephen C