黑马程序员技术交流社区

标题: 为甚么这里要用List而不是ArrayList [打印本页]

作者: 路西法    时间: 2014-3-19 09:55
标题: 为甚么这里要用List而不是ArrayList
写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
public static void main(String[] args) {                final ArrayList target = new ArrayList();//匿名内部类不能引用外部类中非final类型的变量。
                List  proxy =(List)Proxy.newProxyInstance(//为甚么这里要用List而不是ArrayList
                                List.class.getClassLoader(), //还有这里
                                ArrayList.class.getInterfaces(),//这里为甚又用ArrayList
                                new InvocationHandler() {

作者: 梵天的梦    时间: 2014-3-19 11:23
1.因为newProxyInstance方法返回的的Object类型对象,proxy这个引用变量是List类型的,所以你要把的它的返回值赋值给proxy时需要进行类型强转,转换成List;
2.这个参数是为了获取类加载器,为了保证代理类的类加载器和目标类的类加载器一直,所以这个使用了List.class.getClassLoader()也可以使用ArrayList来获取,只要保证它们的加载器是一直的;
3.由于代理类要和目标类要实现相同的接口,为了的获取相同的方法声明,ArrayList实现的接口是List,代理类也要实现这个接口,获取到这个接口中的方法声明,所以这里面使用ArrayList.class.getInterfaces()获取Arraylist实现的接口;
我也是初学代理不知道说的准不准确,我是这么理解的,希望可以能和高人们交流一下
作者: 路西法    时间: 2014-3-19 15:40
梵天的梦 发表于 2014-3-19 11:23
1.因为newProxyInstance方法返回的的Object类型对象,proxy这个引用变量是List类型的,所以你要把的它的返 ...

谢谢,总结的很好哎
作者: 陈鹏83    时间: 2014-7-19 12:17
梵天的梦 发表于 2014-3-19 11:23
1.因为newProxyInstance方法返回的的Object类型对象,proxy这个引用变量是List类型的,所以你要把的它的返 ...

学习了 。。。。。




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