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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 菠萝鱼 中级黑马   /  2014-2-19 10:37  /  1233 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                        //定义一个ArrayList类型的常量
                        final ArrayList target = new ArrayList();
                       
                        List proxy = (List)Proxy.newProxyInstance(
                        List.class.getClassLoader(),//得到类加载器
                        ArrayList.class.getInterfaces(),
                        new InvocationHandler() {
                        public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                                long beginTime = System.currentTimeMillis();//得到当前时间
                                Thread.sleep(10);
                                Object reVal = method.invoke(target, args);
                                long endTime = System.currentTimeMillis();//得到当前时间
                                //输出
                                System.out.println(method.getName()+" runing time is "+(endTime-beginTime));
                                return reVal;
                        }

               
                        });      
代理类是怎么回事,能把上面的代码解释下吗?  

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览
如果需要为已有的实现相同接口的多个类的方法添加一些系统功能,就可以使用代理类,例如,你希望为ArrayList的方法添加一个求方法运行时间的功能,就可以使用动态代理类。因为你希望生成的代理类和ArrayList的功能是一样的,因此,你应该使用和该类一直的类加载器和实现相同的接口才可以。invoke方法中存放的是系统功能的代码,例如你使用ArrayList的添加功能,它就会去调用invoke方法,来运行invoke方法中的系统功能代码。
我也不清楚你哪里不太理解,所以就大概说了一下我的理解,希望可以帮到你。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李金中 于 2014-2-19 15:27 编辑

通过Proxy.newProxyInstance,你得到一个代理类的实例,比如上面代码的就是proxy。
拿代理的一个方法说明流程吧。比如你调用proxy.add();
它就会调用invocationhandler的invoke方法,里面的method传递的就是目标类即List的add对应的method。
所以你通过调用proxy.add()实际上就是调用了list.add()方法,当然是通过反射即invoke。至于怎么实现这一套的,你应该能推测出吧,通过反射机制,可以琢磨出来。
在invocationhandler的invoke方法中,上面的代码在真正调用method.invoke时(即目标对象的add方法),加入了自己的功能,就是计算时间的那个,不就实现了代理的意义么。。。就是可以添加自己想要的功能,还能动态调用目标类的功能。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
谢谢同学们
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马