code: protected void set(final String protocol, final String host, final int port,
        final String authority, final String userInfo, final String path, final String query,
        final String ref) {
      this.protocol = protocol;
      this.host = host;
      this.port = port;
      this.file = query == null ? path : path + "?" + query;
      this.userInfo = userInfo;
      this.path = path;
      this.ref = ref;
      /*
       * This is very important. We must recompute this after the URL has been changed.
       */
      this.hashCodeValue = -1;
      this.query = query;
      this.authority = authority;
    }
docs: Sets the specified 8 fields of the URL. This is not a public method so that only
  URLStreamHandlers can modify URL fields. URLs are otherwise constant.
  
  @param protocol the name of the protocol to use
  @param host the name of the host
  @param port the port number on the host
  @param authority the authority part for the url
  @param userInfo the username and password
  @param path the file on the host
  @param ref the internal reference in the URL
  @param query the query part of this URL
  @since 1.3