简单代理:
package typeinfo; interface Interface { void doSomething(); void doSomethingElse(String arg); } class RealObject implements Interface { @Override public void doSomething() { System.out.println("doSomething"); } @Override public void doSomethingElse(String arg) { System.out.println("SomethingElse " + arg); } } class SimpleProxy implements Interface { private Interface proxied; public SimpleProxy(Interface proxied) { this.proxied = proxied; } @Override public void doSomething() { System.out.println("SimpleProxy doSomething"); proxied.doSomething(); } @Override public void doSomethingElse(String arg) { System.out.println("SimpleProxy doSomethingElse" + arg); proxied.doSomethingElse(arg); } } public class SimpleProxyDemo { public static void consumer(Interface iface){ iface.doSomething(); iface.doSomethingElse("bonobo"); } public static void main(String[] args) { consumer(new RealObject()); consumer(new SimpleProxy(new RealObject())); } }
动态代理:
package typeinfo; import java.lang.reflect.*; class DynamicProxyHandle implements InvocationHandler { private Object proxied; public DynamicProxyHandle(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); } } public class SimpleDynamicProxy { public static void consumer(Interface iface) { iface.doSomething(); iface.doSomethingElse("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 DynamicProxyHandle(real)); consumer(proxy); } }
可以查看方法名
package typeinfo; import java.lang.reflect.*; class MethodSelector implements InvocationHandler { private Object proxied; public MethodSelector(Object proxied) { this.proxied = proxied; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("interesting")) System.out.println("Proxy detected the interesting method"); return method.invoke(proxied, args); } } interface SomeMethods { void boring1(); void boring2(); void interesting(String arg); void boring3(); } class Implementaction implements SomeMethods { @Override public void boring1() { System.out.println("boring1"); } @Override public void boring2() { System.out.println("boring2"); } @Override public void interesting(String arg) { System.out.println("interesting " + arg); } @Override public void boring3() { System.out.println("boring3"); } } class SelectingMethods { public static void main(String[] args) { SomeMethods proxy = (SomeMethods)Proxy.newProxyInstance( SomeMethods.class.getClassLoader(), new Class[]{SomeMethods.class}, new MethodSelector(new Implementaction()) ); proxy.boring1(); proxy.boring2(); proxy.interesting("bonobo"); proxy.boring3(); } }