2015-09-07 11:44:36 -06:00
|
|
|
// typeinfo/SimpleDynamicProxy.java
|
2015-12-15 11:47:04 -08:00
|
|
|
// (c)2016 MindView LLC: see Copyright.txt
|
2015-11-15 15:51:35 -08:00
|
|
|
// We make no guarantees that this code is fit for any purpose.
|
|
|
|
// Visit http://mindviewinc.com/Books/OnJava/ for more book information.
|
2015-06-15 17:47:35 -07:00
|
|
|
import java.lang.reflect.*;
|
|
|
|
|
|
|
|
class DynamicProxyHandler implements InvocationHandler {
|
|
|
|
private Object proxied;
|
|
|
|
public DynamicProxyHandler(Object proxied) {
|
|
|
|
this.proxied = proxied;
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
public Object
|
|
|
|
invoke(Object proxy, Method method, Object[] args)
|
|
|
|
throws Throwable {
|
|
|
|
System.out.println("**** proxy: " + proxy.getClass() +
|
|
|
|
", method: " + method + ", args: " + args);
|
|
|
|
if(args != null)
|
|
|
|
for(Object arg : args)
|
|
|
|
System.out.println(" " + arg);
|
|
|
|
return method.invoke(proxied, args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class SimpleDynamicProxy {
|
|
|
|
public static void consumer(Interface iface) {
|
|
|
|
iface.doSomething();
|
|
|
|
iface.somethingElse("bonobo");
|
|
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
|
|
RealObject real = new RealObject();
|
|
|
|
consumer(real);
|
|
|
|
// Insert a proxy and call again:
|
|
|
|
Interface proxy = (Interface)Proxy.newProxyInstance(
|
|
|
|
Interface.class.getClassLoader(),
|
|
|
|
new Class[]{ Interface.class },
|
|
|
|
new DynamicProxyHandler(real));
|
|
|
|
consumer(proxy);
|
|
|
|
}
|
2015-09-07 11:44:36 -06:00
|
|
|
}
|
|
|
|
/* Output:
|
2015-06-15 17:47:35 -07:00
|
|
|
doSomething
|
|
|
|
somethingElse bonobo
|
|
|
|
**** proxy: class $Proxy0, method: public abstract void
|
|
|
|
Interface.doSomething(), args: null
|
|
|
|
doSomething
|
|
|
|
**** proxy: class $Proxy0, method: public abstract void
|
|
|
|
Interface.somethingElse(java.lang.String), args:
|
|
|
|
[Ljava.lang.Object;@1c7c054
|
|
|
|
bonobo
|
|
|
|
somethingElse bonobo
|
2015-09-07 11:44:36 -06:00
|
|
|
*/
|