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的源代码。

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

}

}

}

}

}

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 url 协议_Java自定义URL协议相关推荐

  1. url scheme Linux,自定义URL Scheme完全指南

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身"绑定"到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 ...

  2. java.net.url 兼容_java.net.Url类的应用(网络编程)

    一.认识URL 类 URL 代表一个统一资源定位符,它是指向互联网"资源"的指针.资源可以是简单的文件或目录,也可以是更为复杂的对象的引用,例如对数据库或搜索引擎的查询. 简单的可 ...

  3. java相关协议_java相关网络协议是什么

    能够有效保证我们上网安全的就是网络协议,那么java相关网络协议是什么?了解网络安全常识,首先就要了解佰佰安全网小编就带您认识一下吧. 1.概述 Java通过协议获取网络数据或者从设备上获取设备数据的 ...

  4. java报文封装_Java自定义协议报文封装 添加Crc32校验的实例

    刚做完的demo,直接进入主题了,开启两个线程,模拟Socket服务端和客户端通信,将数据封装为指定格式报文发送 代码: import java.io.IOException; import java ...

  5. android自定义url协议,Android自定义URL方案…?

    我试图创建自己的URL方案,这样我的Android应用程序就可以通过一个URL被调用,但目前我还没有成功. 我想使用这个网址:cedemo://com.cedemo.scan?TOTO 以下是我的清单 ...

  6. java 特殊字符过滤器_java处理url中的特殊字符

    java处理url中的特殊字符(如&,%...) URL(Uniform Resoure Locator,统一资源定位器)是Internet中对资源进行统一定位和管理的标志. 一个完整的URL ...

  7. java 下载url图片_java下载url图片链接

    1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示 /** * 根据url路径下载图片 * @param filename 处理下载时显示设置好的中文名 ...

  8. 取消java相关网络协议_java相关网络协议可以关掉吗

    Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...

  9. java 中文 转义_java下载url路径包含中文需要转义的操作

    大家看这个url: http://127.0.0.1:9997/file/江苏省地震应急预案(二级).docx 应为url路径中有中文没有转义,输入流报错 The valid characters a ...

最新文章

  1. python urllib2 开启调试
  2. 众推平台架构——分布式爬虫
  3. [云炬创业基础笔记]第二章创业者测试5
  4. 【翻译】asp.net core中使用MediatR
  5. 1.5 编程基础之循环控制 45 金币 方法二(python3实现)
  6. Python 时间复杂度
  7. 科学家之殁,竟是区块链之过?
  8. 前端直接访问登录页面报错_如何实现登录、URL和页面按钮的访问控制
  9. 伪春菜.ayc(.dic)文件解密
  10. VTK系列57_VTK对几何体网格细化(多分辨率处理)
  11. 全国计算机等级证书和职业资格证书(计算机)哪个好
  12. 微型计算机97 占有率,第1章++微型计算机基础.ppt
  13. php strtok函数,strtok函数的用法是什么
  14. Java8使用jdeps —— Java类依赖性分析器
  15. Word里面最难删的东西,困扰了97.99%的职场人,实在是太烦人了
  16. 再Windows下 .Pages格式怎么保存为word或者PDF格式
  17. 青龙面板薅羊毛教程之矿二代每日保底1R
  18. nginx转发post请求
  19. Lake Counting S
  20. echarts改变字体颜色

热门文章

  1. 数组的几种定义方式及初始化
  2. zookeeper-大数据Week6-DAY1-1-Zookeeper
  3. 《Oracle数据库管理与维护实战》——1.2 Oracle各版本异同
  4. mysql中rm+-f_Mysql命令大全
  5. 阿里mysql锁_【mysql】mysql中的锁机制
  6. Oracle fgs(精细审计)使用
  7. python学习--关注容易被忽略的知识点--(三)高级特性
  8. [摘抄]隧道尽头的灯
  9. armbian搭建php环境,N1刷armbian后搭建lamp环境+可道云管理
  10. 轻松解决idea一直卡在Resolving Maven dependencies的问题