嗨,我正在尝试深入学习 JAVA,因此我将在以下几行中深入研究 JDK 源代码:
URL url = new URL("http://www.google.com");
URLConnection tmpConn = url.openConnection();
我附上源代码并在第二行设置断点并进入代码。我可以看到代码流是: URL.openConnection() -> sun.net.www.protocol.http.Handler.openConnection() 我对此有两个问题
首先在 URL.openConnection() 中,代码是:
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
handler是URLStreamHandler的对象,定义为blow
transient URLStreamHandler handler;
但是URLStreamHandler是一个抽象类,openConnection()方法并没有在里面实现,所以当handler调用这个方法的时候,应该去找一个实现这个方法的子类吧?但是 sun.net.www.protocol 中有很多类实现了这个方法(比如 http.Hanlder, ftp.Handler ) 代码应该如何知道它应该调用哪个“openConnection”方法?在这个例子中,这个 handler.openConnection() 将进入 http.Handler 并且它是正确的。(如果我将 url 设置为ftp://www.google.com,它将进入 ftp.Handler)我无法理解机制。
第二。我附上了源代码,因此我可以进入 JDK 并查看变量,但是对于 sun.net.www.protocol.http.Handler 等许多类,src.zip 中没有源代码。我用谷歌搜索了这个类,网上有源代码我可以得到,但为什么他们没有把它(和许多其他类)放在 src.zip 中?我在哪里可以找到源代码的综合版本?
谢谢!