模块 java.base

接口 ResourceBundleProvider

所有已知的实现类:
AbstractResourceBundleProvider

public interface ResourceBundleProvider
ResourceBundleProvider 是资源包的服务提供者接口。 ResourceBundle.getBundle 工厂方法使用它来定位和加载通过 ServiceLoader 作为模块部署的服务提供者。

开发资源包服务

给定 baseName 资源包的服务必须具有以下形式的完全限定类名:
<package of baseName> + ".spi." + <simple name of baseName> + "Provider"
服务类型位于 spi 子包中,因为它可以打包在与资源包提供程序分开的模块中。例如,名为 com.example.app.MyResources 的资源包的服务必须是 com.example.app.spi.MyResourcesProvider
 package com.example.app.spi;
 public interface MyResourcesProvider extends ResourceBundleProvider {
 }
  

部署资源包服务提供者

资源包可以以模块的形式部署在一个或多个服务提供者中。例如,名为“com.example.app.spi.MyResourcesProvider”的服务提供者具有以下实现类:
 import com.example.app.spi.MyResourcesProvider;
 class MyResourcesProviderImpl extends AbstractResourceBundleProvider
   implements MyResourcesProvider
 {
   public MyResourcesProviderImpl() {
     super("java.properties");
   }
   // this provider maps the resource bundle to per-language package
   protected String toBundleName(String baseName, Locale locale) {
     return "p." + locale.getLanguage() + "." + baseName;
   }

   public ResourceBundle getBundle(String baseName, Locale locale) {
     // this module only provides bundles in French
     if (locale.equals(Locale.FRENCH)) {
       return super.getBundle(baseName, locale);
     }
     // otherwise return null
     return null;
   }
 } 
此示例提供法语locale的“com.example.app.MyResources”资源包。传统上,所有locale的资源包都打包在与资源包基本名称相同的包中。当在多个模块和两个包含同名包 split package 的模块中部署资源包时,不支持,每个模块中的资源包可以打包在不同的包中,如本例所示,此提供程序打包资源包在每个语言包中,即法语locale的 com.example.app.fr

提供者可以提供多个服务,每个服务都是针对具有不同基本名称的资源包的服务。

AbstractResourceBundleProvider ResourceBundleProvider 提供了基本实现,子类可以覆盖 toBundleName 方法以返回要加载的资源的提供者特定位置,例如,每个语言包。提供者可以覆盖 ResourceBundleProvider.getBundle 方法,例如仅搜索已知支持的locale或返回其他格式(如 XML)的资源包。

此提供者模块的模块声明指定以下指令:

   provides com.example.app.spi.MyResourcesProvider with com.example.impl.MyResourcesProviderImpl;
 

从提供者处获取资源包

调用 ResourceBundle.getBundle 工厂方法之一以从服务提供者获取资源包的 consumer module 的模块声明必须指定以下指令:基本名称和locale。如果消费者模块是 com.example.app.spi.MyResourcesProvider 的资源包服务提供者,ResourceBundle.getBundle 将仅从服务提供者处定位资源包。否则,ResourceBundle.getBundle 可能会根据正在调用的 ResourceBundle.getBundle 方法的规范继续在其他模块和类路径中搜索资源包。
自从:
9
参见:
  • 方法总结

    修饰符和类型
    方法
    描述
    getBundle(String baseName, Locale locale)
    为给定的包名称和locale返回一个 ResourceBundle
  • 方法详情

    • getBundle

      ResourceBundle  getBundle(String  baseName, Locale  locale)
      为给定的包名称和locale返回一个 ResourceBundle。如果没有找到给定参数的 ResourceBundle,则此方法返回 null
      参数:
      baseName - 资源包的基本包名,一个完全限定的类名
      locale - 应为其加载资源包的locale
      返回:
      为给定参数创建的 ResourceBundle,如果没有找到给定参数的 ResourceBundle,则返回 null