- 已知子类:
DirectoryManager
此类无法实例化。它只有静态方法。
此类文档中提到的 URL 是指由 RFC 1738 及其相关 RFC 定义的 URL 字符串。它是任何符合其中描述的语法的字符串,在java.net.URL类或Web浏览器中可能并不总是有相应的支持。
NamingManager 对于多个线程的并发访问是安全的。
除非另有说明,否则传递给任何方法的 Name
或环境参数均归调用者所有。该实现不会修改对象或保留对它的引用,尽管它可能会保留对克隆或副本的引用。
- 自从:
- 1.3
-
字段摘要
字段 -
方法总结
修饰符和类型方法描述static Context
创建一个上下文,在其中继续上下文操作。static Context
getInitialContext
(Hashtable<?, ?> env) 使用指定的环境属性创建初始上下文。static Object
getObjectInstance
(Object refInfo, Name name, Context nameCtx, Hashtable<?, ?> environment) 为指定的对象和环境创建一个对象的实例。static Object
getStateToBind
(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) 检索对象的状态以进行绑定。static Context
getURLContext
(String scheme, Hashtable<?, ?> environment) 为给定的 URL scheme id 创建上下文。static boolean
确定是否已设置初始上下文工厂构建器。static void
将 InitialContextFactory 构建器设置为构建器。static void
ObjectFactoryBuilder 确定尝试加载对象工厂时使用的策略。
-
字段详细信息
-
CPE
保存环境属性名称的常量,getContinuationContext()
将其CannotProceedException
参数的值存储到该环境属性中。此属性由延续上下文继承,并且可以由该上下文的服务提供者用来检查异常的字段。该常量的值为“java.naming.spi.CannotProceedException”。
- 自从:
- 1.3
- 参见:
-
-
方法详情
-
setObjectFactoryBuilder
ObjectFactoryBuilder 确定尝试加载对象工厂时使用的策略。有关默认策略的说明,请参阅 getObjectInstance() 和类 ObjectFactory。 setObjectFactoryBuilder() 通过安装 ObjectFactoryBuilder 重写此默认策略。随后的对象工厂将使用已安装的构建器加载和创建。只有在执行线程被允许(通过安全管理器的 checkSetFactory() 方法)这样做时,才能安装构建器。安装后,构建器无法更换。
- 参数:
builder
- 要安装的工厂构建器。如果为 null,则不安装构建器。- 抛出:
SecurityException
- 出于安全原因无法安装生成器。NamingException
- 由于与安全无关的原因,无法安装构建器。IllegalStateException
- 如果工厂已经安装。- 参见:
-
getObjectInstance
public static Object getObjectInstance(Object refInfo, Name name, Context nameCtx, Hashtable <?, ?> environment) throws Exception为指定的对象和环境创建一个对象的实例。如果已安装对象工厂构建器,则使用它来创建用于创建对象的工厂。否则,将使用以下规则创建对象:
- 如果
refInfo
是包含工厂类名称的Reference
或Referenceable
,则使用命名工厂创建对象。如果无法创建工厂,则返回refInfo
。在 JDK 1.1 下,如果必须从参考中指定的位置加载工厂类,则必须安装SecurityManager
否则工厂创建将失败。如果在创建工厂时遇到异常,则会将其传递给调用者。 - 如果
refInfo
是没有工厂类名的Reference
或Referenceable
,并且地址是地址类型为“URL”的StringRefAddr
,请尝试与每个 URL 的方案 ID 对应的 URL 上下文工厂来创建对象(请参阅getURLContext()
)。如果失败,请继续执行下一步。 - 按此顺序使用环境的
Context.OBJECT_FACTORIES
属性以及与nameCtx
关联的提供程序资源文件中指定的对象工厂。该属性的值是以冒号分隔的按顺序尝试的工厂类名列表,第一个成功创建对象的就是被使用的。如果无法加载任何工厂,则返回refInfo
。如果在创建对象时遇到异常,则将异常向上传递给调用者。
实现
DirContext
接口的服务提供商应该使用DirectoryManager.getObjectInstance()
,而不是这个方法。仅实现Context
接口的服务提供商应使用此方法。请注意,对象工厂(实现 ObjectFactory 接口的对象)必须是公共的,并且必须具有不接受任何参数的公共构造函数。如果工厂位于命名模块中,则它必须位于由该模块导出到
java.naming
模块的包中。name
和nameCtx
参数可以选择性地用于指定正在创建的对象的名称。name
是对象的名称,相对于上下文nameCtx
。此信息可能对对象工厂或对象实现有用。如果有多个可能的上下文可以从中命名对象——通常是这种情况——则由调用者选择一个。一个好的经验法则是选择可用的“最深”上下文。如果nameCtx
为 null,则name
是相对于默认初始上下文的。如果未指定名称,name
参数应为空。- 参数:
refInfo
- 要为其创建对象的可能为空的对象。name
- 此对象相对于nameCtx
的名称。指定名称是可选的;如果省略,name
应为空。nameCtx
- 指定name
参数的相关上下文。如果为 null,则name
是相对于默认初始上下文的。environment
- 用于创建对象工厂和对象的可能为 null 的环境。- 返回:
-
使用
refInfo
创建的对象;或refInfo
如果无法使用上述算法创建对象。 - 抛出:
NamingException
- 如果在尝试获取 URL 上下文时遇到命名异常,或者访问的工厂之一抛出 NamingException。Exception
- 如果访问的工厂之一抛出异常,或者在加载和实例化工厂和对象类时遇到错误。如果工厂不希望使用其他工厂来尝试创建对象,则工厂应该只抛出异常。请参阅 ObjectFactory.getObjectInstance()。- 参见:
- 如果
-
getURLContext
public static Context getURLContext(String scheme, Hashtable <?, ?> environment) throws NamingException为给定的 URL scheme id 创建上下文。生成的上下文用于解析方案
scheme
的 URL。生成的上下文不绑定到特定的 URL。它能够处理具有指定方案的任意 URL。创建结果上下文的工厂的类名具有命名约定方案编号URLContextFactory(例如“ftpURLContextFactory”为“ftp”scheme-id),在包中指定如下。
Context.URL_PKG_PREFIXES
环境属性(可能包含从系统属性或应用程序资源文件中获取的值)包含以冒号分隔的包前缀列表。属性中的每个包前缀都按照指定的顺序尝试加载工厂类。默认包前缀是“com.sun.jndi.url”(如果指定的包都不起作用,则尝试此默认值)。完整的包名称是使用包前缀构造的,并与方案 ID 连接。例如,如果方案 ID 是“ldap”,并且
Context.URL_PKG_PREFIXES
属性包含“com.widget:com.wiz.jndi”,命名管理器将尝试加载以下类,直到成功实例化:- com.widget.ldap.ldapURLContextFactory
- com.wiz.jndi.ldap.ldapURLContextFactory
- com.sun.jndi.url.ldap.ldapURLContextFactory
如果实例化工厂,则使用以下参数调用它以生成结果上下文。
factory.getObjectInstance(null, environment);
例如,如上所示在 LDAP URL 上下文工厂上调用 getObjectInstance() 将返回可以解析 LDAP URL 的上下文(例如“ldap://ldap.wiz.com/o=wiz,c=us”、“ldap: //ldap.umich.edu/o=umich,c=us", ...)。
请注意,对象工厂(实现 ObjectFactory 接口的对象)必须是公共的,并且必须具有不接受任何参数的公共构造函数。如果工厂位于命名模块中,则它必须位于由该模块导出到
java.naming
模块的包中。- 参数:
scheme
- 上下文支持的 URL 的非空方案 ID。environment
- 在创建对象工厂和上下文时使用的可能为 null 的环境属性。- 返回:
-
用于解析具有方案 ID
scheme
的 URL 的上下文;null
如果未找到用于创建上下文的工厂。 - 抛出:
NamingException
- 如果在创建上下文时发生命名异常。- 参见:
-
getInitialContext
使用指定的环境属性创建初始上下文。这是按如下方式完成的:
- 如果安装了 InitialContextFactoryBuilder,它用于创建用于创建初始上下文的工厂
- 否则,使用
Context.INITIAL_CONTEXT_FACTORY
环境属性中指定的类- 首先,ServiceLoader 机制尝试使用当前线程的上下文类加载器定位
InitialContextFactory
提供者 - 如果失败,此实现会尝试使用内置机制找到合适的
InitialContextFactory
(请注意,初始上下文工厂(实现 InitialContextFactory 接口的对象)必须是公共的,并且必须具有不接受任何参数的公共构造函数。如果工厂位于命名模块中,则它必须位于导出的包中通过该模块到java.naming
模块。)
- 首先,ServiceLoader 机制尝试使用当前线程的上下文类加载器定位
- 参数:
env
- 创建上下文时使用的可能为空的环境属性。- 返回:
- 一个非空的初始上下文。
- 抛出:
NoInitialContextException
- 如果未找到Context.INITIAL_CONTEXT_FACTORY
属性或命名不存在的类或无法实例化的类,或者由于某些其他原因无法创建初始上下文。NamingException
- 如果遇到其他命名异常。- 参见:
-
setInitialContextFactoryBuilder
public static void setInitialContextFactoryBuilder(InitialContextFactoryBuilder builder) throws NamingException 将 InitialContextFactory 构建器设置为构建器。只有在安全管理器允许执行线程这样做时,才能安装构建器。安装后,构建器无法更换。
- 参数:
builder
- 要安装的初始上下文工厂构建器。如果为 null,则不设置构建器。- 抛出:
SecurityException
- 出于安全原因无法安装生成器。NamingException
- 由于与安全无关的原因,无法安装构建器。IllegalStateException
- 如果之前安装了构建器。- 参见:
-
hasInitialContextFactoryBuilder
public static boolean hasInitialContextFactoryBuilder()确定是否已设置初始上下文工厂构建器。- 返回:
- 如果已设置初始上下文工厂构建器,则为真;否则为假。
- 参见:
-
getContinuationContext
创建一个上下文,在其中继续上下文操作。在对跨越多个名称空间的名称执行操作时,来自一个命名系统的上下文可能需要将操作传递给下一个命名系统。上下文实现通过首先构造一个
CannotProceedException
来实现这一点,其中包含精确指出它进行了多远的信息。然后,它通过调用getContinuationContext
从 JNDI 获取延续上下文。然后,上下文实现应该通过在延续上下文上调用相同的操作来恢复上下文操作,使用尚未解析的名称的其余部分。在使用
cpe
参数之前,此方法通过将属性CPE
的值设置为cpe
来更新与该对象关联的环境。此属性将由延续上下文继承,并且可以由该上下文的服务提供者用来检查此异常的字段。- 参数:
cpe
- 触发此延续的非空异常。- 返回:
- 用于继续操作的非空上下文对象。
- 抛出:
NamingException
- 如果发生命名异常。
-
getStateToBind
public static Object getStateToBind(Object obj, Name name, Context nameCtx, Hashtable <?, ?> environment) throws NamingException检索对象的状态以进行绑定。实现
DirContext
接口的服务提供商应该使用DirectoryManager.getStateToBind()
,而不是这个方法。仅实现Context
接口的服务提供商应使用此方法。此方法按顺序使用环境属性中的
Context.STATE_FACTORIES
属性以及与nameCtx
关联的提供程序资源文件中的指定状态工厂。该属性的值是以冒号分隔的按顺序尝试的工厂类名称列表,第一个成功返回对象状态的就是被使用的。如果无法通过这种方式检索对象的状态,则返回对象本身。如果在检索状态时遇到异常,则将异常传递给调用者。请注意,状态工厂(实现 StateFactory 接口的对象)必须是公共的,并且必须具有不接受任何参数的公共构造函数。如果工厂位于命名模块中,则它必须位于由该模块导出到
java.naming
模块的包中。name
和nameCtx
参数可以选择性地用于指定正在创建的对象的名称。有关详细信息,请参阅ObjectFactory.getObjectInstance()
中“名称和上下文参数”的描述。此方法可能会返回一个
Referenceable
对象。获取此对象的服务提供者可以选择直接存储它,或提取其引用(使用Referenceable.getReference()
)并存储它。- 参数:
obj
- 要为其绑定状态的非空对象。name
- 此对象相对于nameCtx
的名称,如果未指定名称则为 null。nameCtx
- 相对于指定name
参数的上下文,如果name
相对于默认初始上下文,则为 null。environment
- 用于创建状态工厂和对象状态的可能为空的环境。- 返回:
-
表示
obj
的绑定状态的非空对象。它可能是对象 (obj
) 本身。 - 抛出:
NamingException
- 如果访问的工厂之一抛出异常,或者在加载和实例化工厂和对象类时遇到错误。如果工厂不希望使用其他工厂来尝试创建对象,则工厂应该只抛出异常。参见StateFactory.getStateToBind()
。- 自从:
- 1.3
- 参见:
-