- 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/
这段代码: interface I {} public class Test { TableView table; Test(ObservableList list) {
我们从 .NET 2.0 升级到 .NET 3.5。我的一位同事尝试在 Visual Studio 2008 中的调试器下运行 ASP .NET Web 项目时出现以下对话框。他可以正常构建,但无法调
我有一个具有class User extends Authenticatable的用户模型类,并且我也创建了另一个具有class Foo extends Model的模型类 这会在显示路线文件中的数据
我遇到的一个常见问题 @extend当试图用另一个 @extend 覆盖继承的属性时. 这是一个例子: // class selectors to be @extended // these coul
我对以下代码的 typescript 编译错误感到困惑: function f(x: T, y: S) { if (x === y) { // ERROR: This condition
这与对象 {} === {} 无关, found this issues不知道这个是不是一样 类型集 - AUnion 不是空集。另外两种类型(L 和R)正在扩展它。我的理解是这些 L、R 至少和 A
我收到以下错误: Extender Provider failed to return an Extender for this object 尝试为 .Net v4.7.2 加载 WCF 项目时。我
我收到以下错误: Extender Provider failed to return an Extender for this object 尝试为 .Net v4.7.2 加载 WCF 项目时。我
我刚刚在读Javascript: Module Pattern vs Constructor/Prototype pattern?我很好奇,当我们使用 $.fn.extend 或 $.extend 扩
我正在用 extend 做一些测试,在我做了一些观察后我有点困惑。初步观察: console.log($.extend === $.fn.extend); // trure // and since
我一直在使用一些通用方法从元素的可变参数创建集合,例如 public Set createSet( T... elements ) { ... 然而,最近我遇到了编译器没有按照我的预期去做的情况。以
刚去面试,问了一个问题。 面试官 - Java 是否支持多重继承? 我 - 不 面试官 - Java 中的每个类都扩展了类 Object(类 Object 除外),如果我们从外部扩展一个类,例如 Cl
我目前正在实现我的第一个 GWT 应用程序,我只是有一个快速的问题,关于在创建复杂的自定义小部件时 Extends Composite 和 Extend a specified widget 之间的区
使用 Observable 扩展 Object 和应用于以下类的扩展 Observable 之间有什么区别。 当应用程序运行时,结果是一样的。 library models; import 'pack
我制作了一个类装饰器,我想限制这个装饰器只能应用于某些类,所以我这样做了: @decorator() class A { foo:string; } @decorator() class B
在这个例子中: import java.util.*; public class Example { static void doesntCompile(Map> map) {} st
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
我是 Java 的新手,正在尝试从 Java 泛型和集合一书中理解以下奇怪的语法。(我广泛使用 C++ 模板,因此可以声称了解泛型编程的基础知识和可能的陷阱): interface Collect
注意:这个问题与 Enum 无关,所以它不是重复的。Enum 被迫只与自身比较,因为编译器生成类型参数,而不是因为 java 递归类型参数。 我试图找到将类声明为的优势: public class S
有人知道是否可以延长 child Blade 吗? 我的应用程序有一个通用的布局模板,然后每个页面都从该模板@extends。每个页面都可以根据需要为其他 HTML block (例如模态)引入一系列
我是一名优秀的程序员,十分优秀!