>我正在用java编写网络代码,它看起来像下面:
//Declaring the reference variable
HttpsURLConnection httpsURLConnection = null;
AuthHttpURLConnection authHttpURLConnection = null;
httpsURLConnection = (HttpsURLConnection) ProxyUrlConnection.openConnection(url);
httpsURLConnection.setSSLSocketFactory(getSocketFactory());
authHttpURLConnection = new AuthHttpURLConnection(httpsURLConnection);
我不是ProxyUrlConnection和AuthHttpURLConnection的作者,但这里有一个描述:
ProxyURLConnection
public class ProxyURLConnection{
public static synchronized URLConnection openConnection(URL url) throws IOException {
URLConnection urlConnection = null;
urlConnection = url.openConnection();
return urlConnection;
}
... more stuff
}
AuthHttpURLConnection
public class AuthHttpUrlConnection() extends HttpURLConnection{
public AuthHttpURLConnection(HttpURLConnection connection) {
super(connection.getURL());
// sets up the auth headers
}
}
最后是 HttpURLConnection和 HttpsURLConnection
我的具体问题:
我如何能够进行此转换? openConnection 返回一个 URLConnection 的对象,我怎样才能进行这种向下转换而不会收到任何运行时错误?
(HttpsURLConnection) ProxyUrlConnection.openConnection(url);
以下隐式向上转换是如何工作的?
AuthHttpURLConnection(httpsURLConnection);
我知道向上转换总是合法的,但是如果我这样做,那么该实例是否成为httpURLConnection的对象而不是httpsURLConnection,一旦发生这种情况,我如何能够在httpURLConnection的对象上调用方法setSSLSocketFactory,因为此方法仅存在于httpsURLConnection中?
一般来说,以下代码有几个可能的运行时流:
httpsURLConnection = (HttpsURLConnection) ProxyUrlConnection.openConnection(url);
httpsURLConnection.setSSLSocketFactory(getSocketFactory());
- 如果传递的
url
参数具有"https://"方案,那么它应该可以正常工作。 - 如果传递的
url
以任何其他方案开头(例如。'http://', 'ftp://')然后ProxyUrlConnection.openConnection(url);
可能会返回URLConnection
的不同实现(例如HttpURLConnection
,JarURLConnection
),那么你的代码仍将编译,但是,在应用程序运行时,你会得到一个ClassCastException
,这将阻止流的进一步执行(因此来了你的问题:setSSLSocketFactory
永远不会被实际调用用于URLConnection
的其他实现)
只要在此处理流之前对https://
方案进行显式验证,就可以使用该代码段,否则您必须显式处理返回不同URLConnection
实现以防止ClassCastException
的情况。
长话短说:
我如何能够进行此转换? openConnection 返回一个 URLConnection 的对象,我怎样才能进行这种向下转换而不会收到任何运行时错误?
只要你有显式强制转换,那么这段代码就会编译。但是,如果返回除HttpsURLConnection
之外的任何其他URLConnection
实现,它将在应用程序运行时失败,ClassCastException
我如何在httpURLConnection的对象上调用方法setSSLSocketFactory,因为此方法仅存在于httpsURLConnection中?
如果提供了非"https"URI,则应用程序执行流将在到达setSSLSocketFactory
方法调用之前ClassCastException
失败(请参阅上一点)
以下隐式向上转换是如何工作的?
AuthHttpURLConnection(httpsURLConnection);
只要应用程序流达到这一点,这个隐式强制转换将始终有效,这将确保connection
是HttpURLConnection
的任何子类的实例,否则ClassCastException
会在该点之前被抛出(请参阅前面的 2 点)
希望这有帮助。