|
|||
|
How can I dynamically invoke a method on a Proxy, where the method
belongs to one of the proxied interfaces? Normally (i. e. in the non-proxy case), one would do something like this: protected Object invokeDelegated( Method m, Object[] args, Object delegate ) throws Exception { // m is a method from an interface that is not implemented by delegate // find the corresponding method in delegate interface and invoke Class<?>[] parameterTypes = new Class[args.length]; for( int i = 0; i < args.length; i++ ) { parameterTypes[i] = args[i].getClass(); } Method meth = delegate.getClass().getMethod( m.getName(), parameterTypes ); return meth.invoke( delegate, args ); } However, when delegate is itself a proxy, then delegate.getClass() will give me Proxy, which is not what I'm looking for. How can I dynamically invoke the methods in the proxied interfaces? -- Sebastian |
|
|
||||
|
||||
|
|
|
|||
|
On 08/02/12 08:19, Sebastian wrote:
> However, when delegate is itself a proxy, then delegate.getClass() > will give me Proxy, Are you sure? I get $Proxy0 from this: import java.lang.reflect.*; public class GetProxyClass { public static void main(String[] args) throws Exception { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); InvocationHandler behaviour = new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) { System.out.println("Called " + method); return null; } }; Object proxy = Proxy.newProxyInstance(classLoader, new Class<?>[] { Runnable.class }, behaviour); Class<?> proxyClass = proxy.getClass(); System.out.println("Proxy class is: " + proxyClass); Method m = proxyClass.getMethod("run", new Class<?>[0]); ((Runnable) proxy).run(); m.invoke(proxy); } } Output: Proxy class is: class $Proxy0 Called public abstract void java.lang.Runnable.run() Called public abstract void java.lang.Runnable.run() It also demonstrates a method on the implemented interface being looked up and invoked. -- ss at comp dot lancs dot ac dot uk |
|
|||
|
Am 08.02.2012 11:34, schrieb Steven Simpson:
> On 08/02/12 08:19, Sebastian wrote: >> However, when delegate is itself a proxy, then delegate.getClass() >> will give me Proxy, > > Are you sure? I get $Proxy0 from this: > [coding snipped] > > Output: > > Proxy class is: class $Proxy0 > Called public abstract void java.lang.Runnable.run() > Called public abstract void java.lang.Runnable.run() > > It also demonstrates a method on the implemented interface being looked > up and invoked. Thanks for that. I found my mistake - the reason that I could not find the target method turned out to be different classloaders for the argument types, so the signatures did not match. -- Sebastian |
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|