- 浏览: 653140 次
- 性别:
- 来自: 宇宙中的某个角落
文章分类
- 全部博客 (244)
- Java SE (57)
- EJB3.0 (7)
- Architecture (15)
- DDD (4)
- UML&GOF Patterns (17)
- scala (0)
- hadoop (1)
- Hibernate&JPA (8)
- webwork (2)
- Problems and Solution (3)
- search engine (Lucene) (4)
- .net C# (2)
- Web develop (9)
- OS(windows&linux) (2)
- Software Engineering (0)
- Resource shara (5)
- Javascript (1)
- apple (1)
- Data structure (11)
- English study (32)
- Assembly language (2)
- Feeling&emotion (5)
- Diary (23)
- Entertainment (17)
- 诗词赏析 (8)
- 道德经 (1)
- ios (5)
最新评论
-
zhuzf:
写的太好了
实例分析Java Class的文件结构 -
随便小屋:
写的太好了,Mark一下,楼主辛苦了!
实例分析Java Class的文件结构 -
lowkey2046:
<div class="quote_title ...
高性能IO设计的Reactor和Proactor模式 -
BigBird2012:
“JVM引入了分代收集的策略,其中对新生代采用"Ma ...
JVM内存模型以及垃圾收集策略解析 -
xuelian2010:
找到合适的人做正确的事情!!!
三月份辞职创业,北京第一家线下体验店成功开张,伙伴们加油!
Java 提供了对 URL 协议进行扩展的能力,通过扩展用户可以自定义 URL 通信协议, JDK 默认提供了对 HTTP,FTP,JAR,FILE 等的实现,而当需要自己定义通信协议的时候,就需要利用 JDK 提供的对 URL 扩展机制进行自定义。
JDK 主要提供了如下三种方式对 URL 进行扩展,每种方式都有各自的使用场景,下面我们分别看看具体 JDK 都给我们提供了哪些扩展点。
1. 实现 URLStreamHandlerFactory 接口,然后调用 URL.setURLStreamHandlerFactory.
采用这种方式的情况下,需要确保应用的其他地方没有调用 setURLStreamHandlerFactory ,因为此方法只能调用一次,如果多次调用会抛出 java.lang.Error: factory already defined. 比如在一些应用服务器的中使用的时候就要多加注意。
2. 创建 URLStreamHandler 的子类,这种方式必须满足如下两个约定:
a) 子类的类名必须是 Handler ,同时最后一级的包名必须是协议的名称,比如你自己定义了名为 mem 的协议,那么 handler 的全名不须是 com.company.protocol.Handler.
b) JVM 启动的时候,需要设置 java.protocol.handler.pkgs 系统属性,如果有多个实现类,那么中间用 | 隔开。
上面两个约定我们可以通过查看 JDK 中的 URL 的源代码,可以清晰的看到为什么要遵循这两个约定。下面我们就看一下 JDK 中关于 URL 的源代码。
static URLStreamHandler getURLStreamHandler(String protocol) { …… …… if (handler == null) { //这里获取java.protocol.handler.pkgs系统属性,同时用“|”隔开 String packagePrefixList = null; packagePrefixList = (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction( protocolPathProp, "")); if (packagePrefixList != "") { packagePrefixList += "|"; } // REMIND: decide whether to allow the "null" class prefix // or not. packagePrefixList += "sun.net.www.protocol"; StringTokenizer packagePrefixIter = new StringTokenizer(packagePrefixList, "|"); while (handler == null && packagePrefixIter.hasMoreTokens()) { String packagePrefix = packagePrefixIter.nextToken().trim(); try { //这里packagePrefix就是你自己制定的包名,protocol为你自定义的协议名,这 String clsName = packagePrefix + "." + protocol + ".Handler"; Class cls = null; try { cls = Class.forName(clsName);// 用加载URL的类加载器加载 } catch (ClassNotFoundException e) { ClassLoader cl = ClassLoader.getSystemClassLoader(); //采用系统类加载器加载 if (cl != null) { cls = cl.loadClass(clsName); } } if (cls != null) { handler = (URLStreamHandler) cls.newInstance(); } } catch (Exception e) { // any number of exceptions can get thrown here } } } } }
当采用这种方法的时候,需要注意的是自己写的 Handler 类必须放在系统类加载器可以加载到的地方。
3 实例化一个 URL 对象的时候传递一个 URLStreamHandler 的实例。这种方式的情况下, JDK 需要一个名为 specifyStreamHandler 的 NetPermission ,这就要求你需要去修改 jdk 安装目录下的 java.policy 文件进行授权。
发表评论
-
Java高级软件攻城狮,你在哪里?
2013-09-17 11:19 0PS:管理员同志, ... -
Java高级软件攻城狮,你在哪里?
2013-09-17 09:46 5创业一年,感触颇多,也走过一些弯路,不过总体上还好。 ... -
Java高级软件攻城狮,你在哪里?我们需要你....
2013-09-06 13:43 88创业一年,感触颇 ... -
实例分析Java Class的文件结构
2013-01-30 11:11 5079今天把之前 ... -
JDK 1.6.0_13 Jaxb的一个Bug
2011-05-10 16:50 2279项目中使用jaxb进行xml binding,但是在jdk1. ... -
Apache+PHP+Mysql的搭建
2010-08-05 19:29 1581以前都是用JAVA,PHP没用过,今天因为一些原因,需 ... -
JVM内存模型以及垃圾收集策略解析【续】
2010-02-22 20:00 7319今天接着补全上篇博文 ... -
JVM内存模型以及垃圾收集策略解析
2010-02-21 21:19 9919首先祝大家春节愉快,几个月前研究了一下JVM的内存模型,整理学 ... -
Java类加载器解析
2008-08-10 19:03 2199作者:狂放不羁 网址:http://yuquan-nana.i ... -
捕获checked exception后什么都不做的代价
2008-05-09 13:03 1688最近在做一个小项目,做到注册模块的时候,如果查询数据库后,发现 ... -
Three kinds of attributes in servlet
2008-03-02 00:21 1452There are three kinds of attrib ... -
My first Android programe!
2007-11-18 12:26 1337Today,i writed my first Android ... -
Java是剑客;.NET是刀客(转载)
2007-10-21 22:22 1434剑,一把好剑,重 ... -
高级语言发展简图
2007-09-30 15:35 1827C/C++语言谱系图 -
C#,C++ 与JAVA
2007-09-30 15:31 1673C#(C-Sharp)是Microsoft的新编程语言,被誉为 ... -
[转帖]利用Eclipse编辑中文资源文件
2007-09-09 03:57 4780如果经常使用Struts,并做过国际化操作的人来说,对于中文资 ... -
JAVA类加载器
2007-09-01 20:12 1680Java中加载器的种类大致可以分为四种:Bo ... -
JAVA类加载以及反射机制
2007-08-28 20:11 7361JAVA中类文件加载 ... -
小游戏
2007-08-28 16:48 1795偶前段时间写的小游戏。呵呵。。 -
今天起的早
2007-08-28 06:25 1235呵呵,今天早上很早就醒了。。记录一下这早起的早晨。
相关推荐
URI与URL的区别一.先来序言一段二.协议的自定义的理解三.自定义协议与URL的关系四.URL自定义私有协议实战五.后话,自定义mineType解析器
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...
◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
3)网络包(java.net):支持Internet的TCP/IP协议,用于实现Socket编程;提供了与Internet的接口,支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。 4)抽象图形用户接口包(javax.swing):实现了...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
获取URL信息,主要是使用URLConnection类,GetUrlInfo.java; web浏览器,webbrowser.java; 获取IP地址和域名,GetIpAddress.java; Http客户端,httpClient.java; 基本socket编程,介绍socket编程的基本步骤,启动...
◇8.2 基于URL的高层次Java网络编程 ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本...
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...