100分求:URLConnection源代码解析 http://hc.apache.org/downloads.cgiLZ 去下你项目对包对应的源码必须版本相同然后在myeclipse7.0中指定路径源码然后DEBUG就能看到了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这些都是抽象类,这些方法被最终实现类覆盖了.那些类在sun的包下.看下URL类的open方法(或者是connect方法)那里有如何通过协议找到协议对应连接实现类的处理过程. 其实是一套标准,具体的都需要向tomcat,我们的程序等,实现 试着解释下:首先URLConnection是个代表所有类型连接的连接类,包括文件连接,Http等协议的连接。所以它自身并不实现任何涉及到协议相关的方法。针对getHeaderField()方法,为什么它的修饰词不是abstract的,也不是native的,而是public的?因为URLConnection并不要求子类一定要实现这个方法,所以不是abstract的,并且它不是由本地代码实现的,所以不是native的,包外面的类需要访问它,所以不能使用默认的修饰词。对getInputStream()方法也可按照上述思路解释。你在debug时看不到source,很简单,因为你没有最终子类的源代码,实际运行的类肯定不是HttpURLConnection,因为它是abstract类,不能实例化。 URLConnection 是根据各种协议交给不同的协议处理实现子类去处理的,这是典型的多态。http:// 的 HTTP 协议交给 java.net.HttpURLConnection 的子类 sun.net.www.protocol.http.HttpURLConnection 处理ftp:// 的 FTP 协议交给 URLConnection 的子类 sun.net.www.protocol.ftp.FtpURLConnection 处理file:// 的 FILE 协议交给 URLConnection 的子类 sun.net.www.protocol.file.FileURLConnection 处理https:// 的 HTTPS 协议交给 javax.net.ssl.HttpsURLConnection 的子类 sun.net.www.protocol.https.HttpsURLConnectionImpl 处理jar:// 的交给 java.net.JarURLConnection 子类 sun.net.www.protocol.jar.JarURLConnection 处理mailto:// 的交给 URLConnection 的子类 sun.net.www.protocol.mailto.MailToURLConnection 处理 com.sun 和 sun 开头包名的类都是 JRE 的底层,被找包在 rt.jar 这个 jar 包中。虽然在 Eclipse 中可以使用反编译工具打开,但是如果想要看这些类带有注释的源代码的话,应该去下载 JDK 所有的源代码。http://download.java.net/openjdk/jdk6/ 对楼主的钻研态度感到敬佩~~~~自愧不如。打开相关的class看了下,的确如楼主所见,返回为null,又写了个非常简单的程序测试,代码如下,没有其他调用了: try { URL url = new URL("http://www.google.com.cn"); URLConnection con = url.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setReadTimeout(0); con.setConnectTimeout(0); con.connect(); System.out.println("HeaderField:" + con.getHeaderField("content-type")); } catch(Exception e) { System.out.println("Exection:" + e.getMessage()); } 可以看见能打印出HeaderField,而不是null!又查到帮助文档上有这样的话:“openConnection返回的连接将为该子类的类型。例如,对于 HTTP,将返回 HttpURLConnection,对于 JAR,将返回 JarURLConnection。”所以getHeaderField应该是某个子类的方法。调用的应该不是URLConnection的getHeaderField,根据帮助文档应该返回的是HttpURLConnection,但从代码也找不到该方法,但是有个调用,需要继续研究。如果需要在debug下看见源代码,项目中需要把相关的源代码装入。在java安装目录下的src.zip有源代码。 比如HttpURLConnection的话,是在URL类的static URLStreamHandler getURLStreamHandler(String protocol)方法中确认其具体实现子类的某类型URLStreamHandler(通过反射) 再通过其openConnection方法获得 哇哇哇回帖质量远远超过我的想象,可惜我只能发100分的帖子,谢谢各位了,特别是huangwj20042008,火龙果,qqbz,dracularking.对火龙果的敬仰之情真如长江之水,连绵不绝啊。还有就是我想知道:“http:// 的 HTTP 协议交给 java.net.HttpURLConnection 的子类 sun.net.www.protocol.http.HttpURLConnection 处理 ftp:// 的 FTP 协议交给 URLConnection 的子类 sun.net.www.protocol.ftp.FtpURLConnection 处理 ”你是用什么方法获得这个的 楼主,其实这个很简单:URLConnection connection = url.openConnection();System.out.println(connection.getClass().getName());呵呵,明白了吧? 至于 URL#openConnection() 是如何实例化子类、子类是如何工作的,那就需要查看相关类的源代码了。 CachedRowSet怎么实例化对象 请问:工龄计算的算法,按年月日来算,以月为结果 刚上岗位,做手机软件开发的。有几个问题想求助。 关于java继承的一个问题 用jawin完成java调用C++的dll文件的问题 初学JBulider2005,菜鸟问题,送高分求解………………!! JFreeChart Developer Guide 今天才搞到的,有要的吗? 高分请教一个Socket编程服务器端的问题! 急急!!!properties资源文件的读取问题... 这个applet哪错了??? 短信猫在startService这不执行了,也没报错 URLENCODE问题
首先URLConnection是个代表所有类型连接的连接类,包括文件连接,Http等协议的连接。所以它自身并不实现任何涉及到协议相关的方法。针对getHeaderField()方法,为什么它的修饰词不是abstract的,也不是native的,而是public的?因为URLConnection并不要求子类一定要实现这个方法,所以不是abstract的,并且它不是由本地代码实现的,所以不是native的,包外面的类需要访问它,所以不能使用默认的修饰词。对getInputStream()方法也可按照上述思路解释。
你在debug时看不到source,很简单,因为你没有最终子类的源代码,实际运行的类肯定不是HttpURLConnection,因为它是abstract类,不能实例化。
ftp:// 的 FTP 协议交给 URLConnection 的子类 sun.net.www.protocol.ftp.FtpURLConnection 处理
file:// 的 FILE 协议交给 URLConnection 的子类 sun.net.www.protocol.file.FileURLConnection 处理
https:// 的 HTTPS 协议交给 javax.net.ssl.HttpsURLConnection 的子类 sun.net.www.protocol.https.HttpsURLConnectionImpl 处理
jar:// 的交给 java.net.JarURLConnection 子类 sun.net.www.protocol.jar.JarURLConnection 处理
mailto:// 的交给 URLConnection 的子类 sun.net.www.protocol.mailto.MailToURLConnection 处理
try
{
URL url = new URL("http://www.google.com.cn");
URLConnection con = url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setReadTimeout(0);
con.setConnectTimeout(0);
con.connect();
System.out.println("HeaderField:" + con.getHeaderField("content-type"));
}
catch(Exception e)
{
System.out.println("Exection:" + e.getMessage());
}
可以看见能打印出HeaderField,而不是null!
又查到帮助文档上有这样的话:
“openConnection返回的连接将为该子类的类型。例如,对于 HTTP,将返回 HttpURLConnection,对于 JAR,将返回 JarURLConnection。”
所以getHeaderField应该是某个子类的方法。调用的应该不是URLConnection的getHeaderField,根据帮助文档应该返回的是HttpURLConnection,但从代码也找不到该方法,但是有个调用,需要继续研究。如果需要在debug下看见源代码,项目中需要把相关的源代码装入。在java安装目录下的src.zip有源代码。
谢谢各位了,特别是huangwj20042008,火龙果,qqbz,dracularking.
对火龙果的敬仰之情真如长江之水,连绵不绝啊。
还有就是我想知道:
“http:// 的 HTTP 协议交给 java.net.HttpURLConnection 的子类 sun.net.www.protocol.http.HttpURLConnection 处理
ftp:// 的 FTP 协议交给 URLConnection 的子类 sun.net.www.protocol.ftp.FtpURLConnection 处理 ”
你是用什么方法获得这个的
System.out.println(connection.getClass().getName());呵呵,明白了吧?