Go Back   Coding Forum > Coding World > Java

Reply
 
LinkBack Thread Tools Display Modes
Old 02-08-2012, 07:40 AM   #1 (permalink)
Sebastian
Guest
 
Posts: n/a
Default Dynamic method invocation on Proxy object?

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
  Reply With Quote
Old 02-08-2012, 10:30 AM   #2 (permalink)
Steven Simpson
Guest
 
Posts: n/a
Default Dynamic method invocation on Proxy object?

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

  Reply With Quote
Old 02-08-2012, 01:30 PM   #3 (permalink)
Sebastian
Guest
 
Posts: n/a
Default Dynamic method invocation on Proxy object?

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

  Reply With Quote
Reply

Thread Tools
Display Modes



All times are GMT. The time now is 01:26 AM.


Powered by vBulletin® Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Copyright ©2010, CodingForum.Org