程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> abstract class-Java openConnection問題

abstract class-Java openConnection問題

編輯:編程解疑
Java openConnection問題
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

如果你覺得答得不錯,就采納吧

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved