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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐进 中级黑马   /  2012-10-27 12:20  /  1568 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写了一个ArrayList的动态代理proxy  可是这个对象只能调用Collection中的方法 ArrayList中的有些方法却不能调用 应该怎么解决呢? 问题已经在代码中标明
public class ProxyTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                final ArrayList target = new ArrayList();
                Collection proxy = (Collection) getProxy(target);//proxy是ArrayList的代理
               
                //测试代理
                //((ArrayList)proxy).ensureCapacity(20);//这里会报错,为什么?注释掉这一行就可以运行正常
                                //proxy.ensureCapacity(20);//这样也报错,为什么?要怎么样才能调用ArrayList所有的方法
                proxy.add(1);
                proxy.add(2);
                proxy.add(3);
                System.out.println(proxy.size());
                System.out.println(proxy.getClass().getName());

        }

        public static Object getProxy(final Object target) {
                Object proxy = Proxy.newProxyInstance(
                                target.getClass().getClassLoader(),
                                target.getClass().getInterfaces(),
                                new InvocationHandler() {
                                       
                                        @Override
                                        public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable {
                                                long beginTime = System.currentTimeMillis();//附加功能
                                                Object reValue = method.invoke(target, args);//调用目标的方法
                                                long endTime = System.currentTimeMillis();//附加功能
                                                //计算方法运行的时间
                                                System.out.println(method.getName() + "'s ran time is " + (endTime-beginTime));
                                                return reValue;
                                        }
                                });
                return proxy;
        }
       
}
哪位能帮我看下,谢谢

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
本帖最后由 周万谋 于 2012-10-27 13:36 编辑

楼主,我觉得你的代理getProxy(target);返回的是ArrayList的代理,所以应该把Collection该成ArrayList,即ArrayList proxy = (ArrayList) getProxy(target);
但是改了后又有异常。


我试了下,把ArrayList改成List,没想到居然就行了,太不科学了。
回复 使用道具 举报
((ArrayList)proxy).ensureCapacity(20);你改了能执行这个方法吗,我试了几次,都不行,不知道为什么,也许代理不能执行子类自己的方法吧
回复 使用道具 举报
唐进 发表于 2012-10-27 14:38
((ArrayList)proxy).ensureCapacity(20);你改了能执行这个方法吗,我试了几次,都不行,不知道为什么,也许 ...

嗯,赞成你的观点,ensureCapacity这个方法必须强转,刚百度了下ensureCapacity(),它好像只是ArrayList的方法,通常用它来初始化ArrayList对象,而且用它可以大大提高效率。楼主很细心啊,细节都考虑到了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马