URL url = new URL("http://www.sina.com.cn");
HttpURLConnection urlConnection = (HttpURLConnection) (url.openConnection());
上面第二句中url.openConnection調用的不是URLStreamHandler裡的抽象函數openConnection嗎
我找不到有哪個子類實現了openConnection,想問哪個子類實現了openConnection?
謝謝!
我來給你找一下,首先你點開url.openConnection();
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
你發現這裡是handler調用的,但是這個handler是怎麼賦值的呢?於是你就需要找哪裡初始化了這個handler
在java裡面,初始化一個對象,要麼靜態代碼塊,要麼就是構造器裡面,於是現在我們點進去URL那個構造器裡面
public URL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException
經過層層點擊,最終調用的是方法簽名是如上的這個類,於是你就看那個handler,哪裡出現了,哪裡初始化了
// Get the protocol handler if not specified or the protocol
// of the context could not be used
if (handler == null &&
(handler = getURLStreamHandler(protocol)) == null) {
throw new MalformedURLException("unknown protocol: "+protocol);
}
this.handler = handler;
你就隨便看幾眼,你就能看到這裡是賦值了,然後你還發現上面if條件裡面有個判斷,就是如果handler == null,
就調用了getURLStreamHandler()這個方法,點進去
你會發現這裡有一個工廠,如果這個協議沒有得到handler就從工場裡面獲取handler。點進去看看
private static class Factory implements URLStreamHandlerFactory {
private static String PREFIX = "sun.net.www.protocol";
public URLStreamHandler createURLStreamHandler(String paramString) {
String str = PREFIX + "." + paramString + ".Handler";
try {
Class localClass = Class.forName(str);
return ((URLStreamHandler) localClass.newInstance());
} catch (ClassNotFoundException localClassNotFoundException) {
localClassNotFoundException.printStackTrace();
} catch (InstantiationException localInstantiationException) {
localInstantiationException.printStackTrace();
} catch (IllegalAccessException localIllegalAccessException) {
localIllegalAccessException.printStackTrace();
}
throw new InternalError("could not load " + paramString + "system protocol handler");
}
}
這裡你就會發現,他使用字符串拼湊的方式,產生一個類的路徑,於是你想找的那個類就是在
sun.net.www.protocol.http.Handler 就是這個類
這裡多次出現了protocol, 這個是什麼呢?
比如說:http://www.baidu.com ftp://192.168.133.100
https://www.baidu.com
這個URL長的都蠻像的,其實這個protocol、就是前面的http,https,ftp等
表示使用什麼通信協議。
所以你就會發現,如果你使用的是ftp開頭的,那麼這個handler就是
sun.net.www.protocol.ftp.Handler
如果你覺得答得不錯,就采納吧