- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在尝试深入学习 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的一个对象,定义如下
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 中没有源代码。我用谷歌搜索了这个类(class),我可以在网上找到源代码,但为什么他们没有把它(和许多其他类(class))放在 src.zip 中?哪里可以找到完整版的源码?
谢谢!
最佳答案
首先是简单的部分:
... I googled this class and there is source code online I can get but why they did not put it (and many other classes) in the src.zip?
两个原因:
在过去 Java 代码库是专有的,这被视为 secret ...并且不包含在 src.zip
中。当他们在 GPL 下重新授权 Java 6 时,他们没有费心去改变它。 (不知道为什么。问Oracle。)
因为 sun.*
树中的任何代码都是正式的“实现细节如有更改,恕不另行通知”。如果他们直接提供代码,则可以帮助客户忽略该建议。当客户代码由于对 sun.*
代码的未经宣布的更改而中断时,这可能会导致更多的摩擦/负面报道。
Where can I find a comprehensive version of source code?
您可以在 OpenJDK 6/7/8 存储库和相关下载包中找到它:
现在是关于“深入学习Java”的部分。
首先,我认为您可能正在以“次优”方式进行此学习。我认为您应该阅读有关 Java 和设计模式的书籍并自己编写代码,而不是阅读 Java 类库。
具体情况:
But
URLStreamHandler
is a abstract class and methodopenConnection()
is not implement in it so when handler calls this method, it should go to find a subclass who implement this method, right?
在处理程序调用 than 方法时,它是在子类的实例上调用它。因此,找到正确的方法由 JVM 处理……就像任何其他多态调度一样。
棘手的部分是如何获得 sun.net.www.protocol.*
处理程序类的实例。发生这样的事情:
创建 URL 对象时,它会调用 getURLStreamHandler(protocol)
来获取处理程序实例。
此方法的代码查看协议(protocol)的处理程序实例是否已存在,如果存在则返回。
否则,它会查看协议(protocol)处理程序工厂是否存在,如果存在,它会使用它来创建处理程序实例。 (协议(protocol)处理程序工厂对象可以由应用程序设置。)
否则,搜索可配置的 Java 包列表以查找 FQN 为 package + "."的类。 +协议(protocol)+“。” + "Handler"
,加载它,并使用反射创建一个实例。 (通过系统属性进行配置。)
对处理程序的引用存储在 URL 的处理程序字段中,并且 URL 构造继续进行。
因此,稍后,当您在 URL 对象上调用 openConnection()
时,该方法使用特定于 协议(protocol)的
。Handler
实例用于创建连接对象的 URL
这个复杂过程的目的是支持开放式协议(protocol)集的 URL 连接,允许应用程序为新协议(protocol)提供处理程序,并以静态和动态方式替换现有协议(protocol)的自己的处理程序。 (而且代码比我上面描述的更复杂,因为它必须处理多个线程。)
这利用了许多设计模式(缓存、适配器、工厂对象等)以及 Java 特定的东西,例如系统属性和反射。但是,如果您没有阅读和理解这些设计模式等,您就不太可能认出它们,因此您可能会发现代码完全是糊涂的。因此我上面的建议是:先学习基础知识!!
关于eclipse - 不懂JAVA中URL.openConnection()中extends的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12764764/
所以我今天在学习c。我编写了一些代码以使用 getchar() 获取输入并将其保存在变量中以了解整数输入的工作原理。 因此,如果用我的键盘输入“1”,然后按回车键,我会返回 4910 的值。我预计 4
我是一个非常沮丧的新手!我真的不知道从哪里开始。我有一个基于傻瓜书中的应用程序的应用程序。成功了。然后尝试将其转换为使用 WIMMOne 对话框来显示时间和日期。经过一系列错误的启动后,我加载了他们的
我们刚刚使用 bitbucket 建立了一个项目。我们将“生产”[P] 代码放在一个存储库中,然后我创建了它的一个分支 [m],然后我的同事 [C] 也创建了一个分支。 [P] /
我不明白我看到的错误,也不明白我应该在我的 ESLint 配置中更改什么来修复它,在深入研究了一段时间之后。 我有一段使用 ECMA 版本 6 (ES6) 的 JS 代码,如下所示: const la
我的代码有很多问题。编译时出现以下错误: “Ecommerce.DataHelpers.ProductNodeLoader”未实现接口(interface)成员“System.Collections.
我不明白这个语法是如何工作的,也找不到关于它的文档: word = '123xyz567' s = ''.join (c if c.isdigit() else ' 'for c in word) 第
不知道怎么解释,是在IE7中出现的,右边的DIV向右浮动,取消设置它的宽度,左边 float 的子DIV会变成和父DIV一样宽。 http://jsfiddle.net/dyvar/1/ IE 7 最
$newUser.addClass(newTweet.user).attr('data-user', newTweet.user).text('@' + newTweet.user + ': ');
我有一个带有输入框的 tkinter GUI,我只想允许数字。有人可以向我解释验证中每个命令/代码行的作用。我不明白 vcmd 变量和所有 '%i' '%s' 的东西。谢谢:) 更新:我有一个不同的应
我正在尝试使用 Richard Dawkin 的 Weasel Program 的 Python 版本这演示了随机选择与累积选择之间的差异,并且我的变异算法存在一些问题。我想也许我不明白如何使用Pyt
我正在学习嵌套,我的任务是让每一行都以缩进开头。这是我的代码,但它不起作用 $nestingDepth = 0 def logger description, &block puts "Beg
我正在编译 gcc 并阅读来自 https://gcc.gnu.org/install/configure.html 的手册 具体说明 --with-local-prefix=dirname Spec
我是一名优秀的程序员,十分优秀!