黑马程序员技术交流社区

标题: 动态代理 [打印本页]

作者: 杨静    时间: 2012-10-14 09:56
标题: 动态代理
interface Interface{
        void doSomething();
        void somethingElse(String arg);
}
class RealObject implements Interface{
         public void doSomething(){
                 System.out.println("doSomething");
         }
        public void somethingElse(String arg){
                 System.out.println("somethingElse "+arg);
        }
}
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);
}
}

public 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);
                //插入代理
                Interface proxy =(Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),
                                new Class[]{Interface.class},new DynamicProxyHandler(real));
                consumer(proxy);

        }

}
调用静态方法newProxyInstance()可以创建动态代理,这个方法需要一个类加载器,一个希望实现的接口列表,以及InvocationHandler的一个实现。动态代理将所有调用重定向到调用处理器。
invoke 方法中传递进代理对象,以防你需要区分请求的来源。对接口的调用将被重定向为对代理的运用。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2