Java代理与动态代理

来源:互联网 发布:小岛微风淘宝店 编辑:程序博客网 时间:2024/04/29 06:41

一、简单代理

代理类和被代理类实现相同的接口,具体代码如下:

因为consumer()接收的是Inerface,所以无法知道正常获得的是RealObject还是SimpleProxy,因为它们都实现了Interface。

SimpleProxy内部会调用RealObject,所以它会执行和RealObject上相同的方法。


接口类

package Resource.Proxy;public interface Interface {void doSomething();void somethingElse(String arg);}

被代理类


package Resource.Proxy;public class RealObject implements Interface {public void doSomething() {System.out.println();}public void somethingElse(String arg) {System.out.println("somethingElse"+arg);}}


代理类

package Resource.Proxy;public class SimpleProxy implements Interface {private Interface proxied;public SimpleProxy(Interface proxied) {this.proxied = proxied;}public void doSomething() {System.out.println("SimpleProxy doSomething");proxied.doSomething();}public void somethingElse(String arg) {System.out.println("SimpleProxy somethingElse" + arg);proxied.somethingElse(arg);}}

测试类

package Resource.Proxy;public class SimpleProxyDemo {public static void main(String[] args) {consumer(new RealObject());consumer(new SimpleProxy(new RealObject()));}public static void consumer(Interface iface) {iface.doSomething();iface.somethingElse("hello world");}}
测试结果


somethingElsehello world
SimpleProxy doSomething


SimpleProxy somethingElsehello world
somethingElsehello world

二、动态代理

代码如下:

package Resource.Proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxyHandler implements InvocationHandler {private Object proxied;public DynamicProxyHandler(Object proxied){this.proxied=proxied;}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);}static class SimpleDynamicProxy{public static void consumer(Interface iface){iface.doSomething();iface.somethingElse(" bonabo");}public static void main(String[] args){RealObject real=new RealObject();Interface proxy=(Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(real));consumer(proxy);}}}




0 0
原创粉丝点击