A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨静 中级黑马   /  2012-10-14 09:56  /  1025 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 方法中传递进代理对象,以防你需要区分请求的来源。对接口的调用将被重定向为对代理的运用。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马