日期:2014-05-20  浏览次数:21832 次

HttpURLConnection的disconnect()方法?
李刚疯狂Java讲义760页代码,部分如下:
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.*;
public class DownUtil
{
// 定义下载资源的路径
private String path;
// 指定所下载的文件的保存位置
private String targetFile;
// 定义需要使用多少线程下载资源
private int threadNum;
// 定义下载的线程对象
private DownThread[] threads;
// 定义下载的文件的总大小
private int fileSize;

public DownUtil(String path, String targetFile, int threadNum)
{
this.path = path;
this.threadNum = threadNum;
// 初始化threads数组
threads = new DownThread[threadNum];
this.targetFile = targetFile;
}

public void download() throws Exception
{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
conn.setRequestProperty(
"Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
+ "application/x-shockwave-flash, application/xaml+xml, "
+ "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
+ "application/x-ms-application, application/vnd.ms-excel, "
+ "application/vnd.ms-powerpoint, application/msword, */*");
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
// 得到文件大小
fileSize = conn.getContentLength();
conn.disconnect();
System.out.println("后面代码省略,因为与问题无关")
}
}

疑问:对于倒数第二行代码,conn.disconnect(),这个conn是HttpURLConnection类型,查阅JDK文档,HttpURLConnection的disconnect()方法是个抽象方法。这是怎么回事?url的openConnection()方法难道返回的是HttpURLConnection的子类,而这个子类实现了disconnect方法?但是HttpURLConnection的子类是HttpsURLConnection类,在web编程中Https协议是Http协议的加密版吧,好像。这里似乎讲不通吗,openConnection方法没理由返回HttpsURLConnection啊。。。。到底怎么回事。求大神指导。。。。。。
HttpURLConnection

------解决方案--------------------
楼主,你可以这样写代码测试:
public class URLDemo {

public static void main(String[] args) throws IOException {

URL url=new URL("http://www.baidu.com");

Class<?> clazz=url.openConnection().getClass();

System.out.println(clazz);

Class<?> superClazz=clazz.getSuperclass();

System.out.println(superClazz);
}

}

控制台输出:

class sun.net.www.protocol.http.HttpURLConnection
class java.net.HttpURLConnection

这样就很明白了。url.openConnection()方法返回的确实是HttpURLConnection类型,但是不是JDK里的java.net.HttpURLConnection,而是sun.net.www.protocol.http.HttpURLConnection,在通过反射拿到这个类的父类,发现它的父类就是java.net.HttpURLConnection,所以它实现了父类的抽象方法disconnect()方法,所以可以直接调用。