URL.openConnection在不同环境中返回HttpsURLConnection的不同实例

问题描述

我正在尝试使用以下代码段在Java中发出Https请求:

1. java.net.URL urlObject = new java.net.URL("/*my https url*/");
2. javax.net.ssl.HttpsURLConnection HttpsURLConnection = (javax.net.ssl.HttpsURLConnection)urlObject.openConnection();

在第2行的运行时,urlObject.openConnection()返回一个sun.net.www.protocol.https.DelegateHttpsURLConnection的实例,该实例被强制类型转换为javax.net.ssl.HttpsURLConnection

但是,在一种环境中,此方法不起作用,并给出以下异常:

java.lang.classCastException: com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection

第2行的urlObject.openConnection()返回一个com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl的实例,该实例无法类型转换为javax.net.ssl.HttpsURLConnection

有人可以帮助我理解为什么urlObject.openConnection()在不同环境中返回不同类的不同实例。与依赖项等有关吗?

其他信息:

  • 我已经阅读了有关此的其他stackoverflow答案。我的目的是了解发生这种情况的根本原因,而在其他答案中却没有传达足够的信息。
  • 我发现一种工作方式是使用com.sun.net.ssl.HttpsURLConnection con = (com.sun.net.ssl.HttpsURLConnection) urlObj.openConnection();代替第2行。但是实际上com.sun.net.ssl.HttpsURLConnection已被弃用。
  • 另一种类似的解决方法是使用Http而不是Https,即使用java.net.HttpURLConnection = (java.net.HttpURLConnection) urlObject.openConnection(); ...但是,这并不能回答我有关问题实际发生原因的问题。
  • 我正在使用openJdk 8

解决方法

您是否有任何特定原因试图将其强制转换为javax.net.ssl.HttpsURLConnection?您可以使用基类URLConnection并执行操作。