こんにちは、JAVA を深く学ぼうとしているので、次の行で JDK ソース コードを掘り下げています。
URL url = new URL("http://www.google.com");
URLConnection tmpConn = url.openConnection();
ソース コードを添付し、2 行目にブレークポイントを設定して、コードにステップ インしました。コード フローは次のとおりです。 URL.openConnection() -> sun.net.www.protocol.http.Handler.openConnection() これについて 2 つの質問があります。
まず URL.openConnection() のコードは次のとおりです。
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
handler は URLStreamHandler のオブジェクトであり、blow として定義します。
transient URLStreamHandler handler;
しかし、URLStreamHandler は抽象クラスであり、メソッド openConnection() は実装されていないため、ハンドラーがこのメソッドを呼び出すと、このメソッドを実装するサブクラスを見つける必要がありますよね? しかし、sun.net.www.protocol (http.Hanlder、ftp.Handler など) にこのメソッドを実装するクラスはたくさんあります。コードはどの「openConnection」メソッドを呼び出す必要があるかをどのように認識すればよいでしょうか? この例では、この handler.openConnection() は http.Handler に入りますが、これは正しいです。(url をftp://www.google.comにすると ftp.Handler に入ります) 仕組みがわかりません。
2番目。JDK にステップインして変数を確認できるようにソース コードを添付しましたが、sun.net.www.protocol.http.Handler などの多くのクラスでは、src.zip にソース コードがありません。このクラスをグーグルで検索したところ、入手できるオンラインのソースコードがありますが、なぜそれ (および他の多くのクラス) を src.zip に入れなかったのですか? 包括的なバージョンのソース コードはどこにありますか?
ありがとう!