在JDK 6 中, 利用其提供的service provider interfaces (SPI) 可以做到很好的国际化处理, 以前你只能使用标准的时区和各种符号, 如果你所在的地区不幸不再这些标志时区中, 或者货币符号也不在其中, 那么你就无能为力了, 现在有了JDK 6 ,我们可以自定义这些服务的提供者了.
为了实现该功能, 在JDK 6中的java.util.spi 包中有个LocaleServiceProvider 类( http://java.sun.com/javase/6/docs/api/java/util/spi/LocaleServiceProvider.html ), 该类是提供该服务的基类. 在JDK 6中有几个具体的服务实现 ,分布在java.text.spi, 和java.util.spi包中, 分布规则为, 如果类XXX在java.text包中, 则相应的XXXProvider类就在java.text.spi'包中. 对于java.util也一样.,
在java.text.spi 中有如下几个类:
BreakIteratorProvider CollatorProvider DateFormatProvider
DateFormatSymbolsProvider
DecimalFormatSymbolsProvider
NumberFormatProvider
在java.util.spi中有如下几个类;
CurrencyNameProvider LocaleNameProvider TimeZoneNameProvider
下面来看一个自定义服务的例子:
那自定义时区名来举例, 实现类如下:
package cn.hexiao.revealed;
import java.util.*;
import java.util.spi.*;
public class MyTimeZoneNameProvider extends TimeZoneNameProvider {
public String getDisplayName(String ID, boolean daylight,int style, Locale locale) {
System.out.println("ID: " + ID);
return ID;
}
public Locale[] getAvailableLocales() {
return new Locale[] {Locale.US};
}
}
只是在返回ID前,打印该ID. 继承TimeZoneNameProvider 类, 你必须要实现 public Locale[] getAvailableLocales() 方法, 来指定可用的Locale.
getDisplayName函数取决于你提供的服务.
只是提供这么一个类,还不可以, 你还要把它打包为jar文件, 在该包的根目录下面还要有一个META-INF目录, 该目录下面还要有个services目录, 在services目录下面有一个以java.util.spi.TimeZoneNameProvider 命名(所提供服务的全限定类名)的文件,该文件的内容为 cn.hexiao.revealed.MyTimeZoneNameProvider(服务提供者的全限定类名). 然后使用
jar cvf Zones.jar META-INF/* cn/* 命令打包,
把打包后的文件放到jre的 lib/ext 目录下. (如果你使用JDK的jar允许程序,就要放到JDK目录下的jre目录中的lib/ext目录下).
下面来完成一个测试程序, 看看效果:
import java.util.*;
public class Zones {
public static void main(String args[]) {
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
System.out.println(tz.getDisplayName(Locale.US));
System.out.println(tz.getDisplayName(Locale.UK));
}
}
允许该程序, 可以看到如下结果,
G:\JDK6>java Zones
ID: America/Los_Angeles
ID: America/Los_Angeles
ID: America/Los_Angeles
ID: America/Los_Angeles
America/Los_Angeles
Pacific Standard Time
JSF中午论坛: http://www.hexiao.cn/jsf/index.php
我们提供的自定义服务生效了, ^_^, Enjoy It !
分享到:
相关推荐
JDK容器学习之Queue:LinkedBlockingQueue
jdk源码, jdk版本: jdk1.8.0_131 jdk源码, jdk版本: jdk1.8.0_131
第二步:右击“我的电脑”属性,选择“高级”选项卡,单击“环境变量”, 第三步:假设JDK的安装路径:E:\jdk,tomcat的安装路径:E:\tomcat 在用户变量中添加下面的变量和属性值 Classpath E:\jdk\lib\tools.jar; ...
java8的tools包,在maven出现无法加载时可以将该包加入maven本地仓库即可解决问题
jdk1.8环境,版本:jdk1.8.0-131 jdk1.8.0_131版本安装包,直接下载到本地,然后解压缩就可以使用啦
医院急诊系统,开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
JDK6的新特性之二:使用JAXB2来实现对象与XML之间的映射 JDK6的新特性之三:理解StAX StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API JDK6的新特性之四:使用Compiler API 现在我们可以用JDK6 ...
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
Java:jdk1.8
MacOS系统Oracle JDK 1.8 官方版本下载,官网网速不好可以在此下载
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
jdk6免安装下载 免费下载
mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...
JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库...
jdk.tools-1.7.jar,解压后放到安装目录下的jdk目录下的lib下面即可。
安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08; 2.安装完成后,右击“我的电脑”,点击“属性”; 3.选择“高级”选项卡,点击“环境变量”; 4.在“系统变量...
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
Java高级编程(JDK6版)原书代码,Java高级编程(JDK6版)原书代码,Java高级编程(JDK6版)原书代码
jdk 6 for mac http://support.apple.com/kb/DL1572?viewlocale=zh_CN&locale=zh_CN,附件太大,无法上传,直接给出下载链接,上传的是记事本文件。
linux快速安装jdk1.8方式及环境配置 一、下载jdk jdk下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html **注:安装之前先查看一下系统有没有已经安装的版本 查看当前系统jdk的版本:...