關於自定義URLStreamHandler的一次踩坑

關於自定義URLStreamHandler的一次踩坑

  • 20180625 lambo init

說明

通常自定義實現url的協議解析.方案爲實現URLStreamHandler.實現其 openConnection 就能夠了, 若是咱們執行 new URL("xx://aa/ff").hashCode();ide

public synchronized int hashCode() {
        if (hashCode != -1)
            return hashCode;
		// 實現爲轉發給自實現的URLStreamHandler 進行處理
        hashCode = handler.hashCode(this);
        return hashCode;
    }

默認URLStreamHandler 處理hashCode爲this

protected int hashCode(URL u) {
        int h = 0;

        // Generate the protocol part.
        String protocol = u.getProtocol();
        if (protocol != null)
            h += protocol.hashCode();

        // Generate the host part.
        InetAddress addr = getHostAddress(u);
        if (addr != null) {
            h += addr.hashCode();
        } else {
            String host = u.getHost();
            if (host != null)
                h += host.toLowerCase().hashCode();
        }

        // Generate the file part.
        String file = u.getFile();
        if (file != null)
            h += file.hashCode();

        // Generate the port part.
        if (u.getPort() == -1)
            h += getDefaultPort();
        else
            h += u.getPort();

        // Generate the ref part.
        String ref = u.getRef();
        if (ref != null)
            h += ref.hashCode();

        return h;
    }

其會進行一次url的訪問拿到內容參數 hashCode. 但通常咱們定義一個url是內容不會變化的. 咱們自定義協議可使用 如下代碼url

@Override
    protected int hashCode(URL u) {
        if(null == u) {
            return 0;
        }
        return u.toString().hashCode();
    }
相關文章
相關標籤/搜索