黑马程序员技术交流社区

标题: 关于url的openConnection()方法,晕菜了~ 求详解,谢谢~~ [打印本页]

作者: 罗文杰    时间: 2012-5-28 01:54
标题: 关于url的openConnection()方法,晕菜了~ 求详解,谢谢~~
本帖最后由 罗文杰 于 2012-5-28 01:58 编辑

关于下段语句:
URLConnection conn = url.openConnection();
url.openConnection();返回的是URLConnection类型的对象,而URLConnection类是个抽象类。
我的重点疑惑点是:我理解的抽象类未经子类覆盖其抽象方法之前,是不能new对象,也不能实例化的,这句通过openConnection()方法返回的不是实例化的URLConnection对象么?这个代码是具体是怎么实现的?我的理解上哪里有误区?
求详细指点~~~ 谢谢了~~感激不尽。
越来越感觉知识掌握的不牢固,继续加油努力~~~{:soso_e194:}
作者: 褚代江    时间: 2012-5-28 06:04
这个用到的可能是多态的,得到的conn就是URLConnection的一个子类对象。父类引用指向子类对象。个人理解,不对大家帮改正啊
作者: 胡团乐    时间: 2012-5-28 06:53
本帖最后由 胡团乐 于 2012-5-28 06:55 编辑

我查看了下文档 首先那个url应该是URL类的一个对象
在URL类里边有个方法  URLConnection openConnection() 返回URLConnection
所以用URL的对象调用方法openConnection()  返回URLConnection对象

在URLConnection抽象类里有个protected  URLConnection(URL url)  构造方法
我觉得肯定是URL的openConnection() 方法实现了URLConnection类的抽象方法 通过protected  URLConnection(URL url) 构造的新对象然后返回它


作者: xieshuhua    时间: 2012-5-28 09:39
本帖最后由 谢述华 于 2012-5-28 09:52 编辑

按图索骥。。。
1、找到openConnection()方法,如图需要handler。
2、找到URL中的handler实例。注:handler是抽象类URLStreamHandler一个定义了的未实例化类。
3、handler  =(URLStreamHandler)cls.newInstance();。
4、cls = cl.loadClass(clsName);
①cl为系统类加载器
②claName是由前面的sun.security.action.GetPropertyAction等方法组成的。
5、找不到GetPropertyAction的源代码了,不过猜测clsName指向一个API,这个API至少应该覆盖
①、URLConnection的connect方法
②、URLStreamHandler的openConnection方法
注:handlers为handler储存集合,factory为自定义handler。(看到这部分的,可以再探讨下)

一路找来,挺有意思的,大家也可以尝试下,希望能够帮到你~~

className调用了这个函数.png (4.15 KB, 下载次数: 50)

4、

4、

handler具体赋值.png (1.59 KB, 下载次数: 29)

3、

3、

引用handler.png (2.32 KB, 下载次数: 37)

1、

1、

handler定义.png (3.45 KB, 下载次数: 36)

2、

2、

作者: 罗文杰    时间: 2012-5-28 10:21
谢谢楼上的几位,二楼一语道破梦中人,不过我刚刚还是找了底层源码,和5楼找的差不多,不过还是没找到具体是指向的哪个子类。以下是我找到的源码:
openConnection()方法:

handler:

URLStreamHandler类下的 openConnection()方法:



可惜绕来绕去又绕回去了……  求各位大侠详细说明下源码的实现,谢谢了,十分感激。
再次感谢楼上的几位帮忙,以及感谢将要出现的帮助我解惑的人,谢谢~~


作者: 罗文杰    时间: 2012-5-28 21:12
{:soso_e149:}求高人指点下源码实现,感激不尽……
作者: xieshuhua    时间: 2012-5-28 23:30
罗文杰 发表于 2012-5-28 21:12
求高人指点下源码实现,感激不尽……

在我图示的newInstance里面呀。URL源文件下面的,你可以再看下。只有这一个出口,找其他的只能到处绕来绕去。。。
作者: 闾丘日月    时间: 2012-5-29 02:03
受教了。。lz提的问题不错。




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