ClassLoader
java.lang.Object
|—java.lang.ClassLoader
public abstract class ClassLoader
extends Object
类加载器是负责加载类的对象。 ClassLoader 类是一个抽象类。给定类的二进制名称,类加载器应该尝试定位或生成构成类定义的数据。一种典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。
每个 Class 对象都包含一个 Class#getClassLoader() 到定义它的 ClassLoader。
数组类的类对象不是由类加载器创建的,而是根据 Java 运行时的要求自动创建的。 Class#getClassLoader() 返回的数组类的类加载器与其元素类型的类加载器相同;如果元素类型是原始类型,则数组类没有类加载器。
应用程序实现 ClassLoader 的子类以扩展 Java 虚拟机动态加载类的方式。
安全管理器通常可以使用类加载器来指示安全域。
ClassLoader 类使用委托模型来搜索类和资源。 ClassLoader 的每个实例都有一个关联的父类加载器。当请求查找类或资源时,ClassLoader 实例将在尝试查找类或资源本身之前将对该类或资源的搜索委托给其父类加载器。虚拟机的内置类加载器,称为“引导类加载器”,它本身没有父级,但可以作为 ClassLoader 实例的父级。
支持并发加载类的类加载器被称为具有并行能力的类加载器,并且需要在类初始化时通过调用 ClassLoader.registerAsParallelCapable 方法来注册自己。请注意,ClassLoader 类默认注册为具有并行功能。但是,如果它们具有并行能力,它的子类仍然需要注册自己。在委托模型不是严格分层的环境中,类加载器需要具有并行能力,否则类加载会导致死锁,因为加载器锁在类加载过程中被持有(参见 loadClass 方法)。
通常,Java 虚拟机以平台相关的方式从本地文件系统加载类。例如,在 UNIX 系统上,虚拟机从 CLASSPATH 环境变量定义的目录中加载类。
但是,某些类可能不是源自文件;它们可能来自其他来源,例如网络,或者它们可以由应用程序构建。 defineClass 方法将字节数组转换为 Class 类的实例。这个新定义的类的实例可以使用 Class#newInstance 创建。
类加载器创建的对象的方法和构造函数可以引用其他类。为了确定引用的类,Java 虚拟机调用最初创建该类的类加载器的 loadClass 方法。
例如,应用程序可以创建一个网络类加载器来从服务器下载类文件。示例代码可能如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
网络类加载器子类必须定义方法 findClass 和 loadClassData 以从网络加载类。 一旦它下载了组成类的字节,它应该使用方法defineClass来创建一个类实例。 一个示例实现是:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
二进制名称
任何作为 String 参数提供给 ClassLoader 中的方法的类名都必须是《Java™ 语言规范》定义的二进制名称。
有效类名的示例包括:
"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"
构造函数摘要
修饰符 | 构造函数 | 描述 |
---|---|---|
protected | ClassLoader() | 使用 getSystemClassLoader() 方法返回的 ClassLoader 作为父类加载器创建一个新的类加载器。 |
protected | ClassLoader(ClassLoader parent) | 使用指定的父类加载器为委托创建一个新的类加载器。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
void | clearAssertionStatus() | 将此类加载器的默认断言状态设置为 false 并丢弃与类加载器关联的任何包默认值或类断言状态设置。 |
protected Class<?> | defineClass(byte[] b, int off, int len) | 已弃用。 替换为 [defineClass(String, byte], int, int) |
protected Class<?> | defineClass(String name, byte[] b, int off, int len) | 将字节数组转换为 Class 类的实例。 |
protected Class<?> | defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) | 使用可选的 ProtectionDomain 将字节数组转换为 Class 类的实例。 |
protected Class<?> | defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) | 使用可选的 ProtectionDomain 将 ByteBuffer 转换为 Class 类的实例。 |
protected Package | definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) | 在此 ClassLoader 中按名称定义包。 |
protected Class<?> | findClass(String name) | 查找具有指定二进制名称的类。 |
protected String | findLibrary(String libname) | 返回本机库的绝对路径名。 |
protected Class<?> | findLoadedClass(String name) | 如果 Java 虚拟机将此加载器记录为具有该二进制名称的类的初始加载器,则返回具有给定二进制名称的类。 |
protected URL | findResource(String name) | 查找具有给定名称的资源。 |
protected EnumerationURL | findResources(String name) | 返回代表具有给定名称的所有资源的 URL 对象的枚举。 |
protected Class<?> | findSystemClass(String name) | 查找具有指定二进制名称的类,并在必要时加载它。 |
protected Package | getPackage(String name) | 返回已由此类加载器或其任何祖先定义的包。 |
protected Package[] | getPackages() | 返回此类加载器及其祖先定义的所有包。 |
ClassLoader | getParent() | 返回委托的父类加载器。 |
URL | getResource(String name) | 查找具有给定名称的资源。 |
InputStream | getResourceAsStream(String name) | 返回用于读取指定资源的输入流。 |
EnumerationURL | getResources(String name) | 查找具有给定名称的所有资源。 |
static ClassLoader | getSystemClassLoader() | 返回委托的系统类加载器。 |
static URL | getSystemResource(String name) | 从用于加载类的搜索路径中查找指定名称的资源。 |
static InputStream | getSystemResourceAsStream(String name) | 打开读取,从用于加载类的搜索路径中指定名称的资源。 |
static EnumerationURL | getSystemResources(String name) | 从用于加载类的搜索路径中查找指定名称的所有资源。 |
Class<?> | loadClass(String name) | 加载具有指定二进制名称的类。 |
protected Class<?> | loadClass(String name, boolean resolve) | 加载具有指定二进制名称的类。 |
protected static boolean | registerAsParallelCapable() | 将调用者注册为具有并行能力。 |
protected void | resolveClass(Class<?> c) | 链接指定的类。 |
void | setClassAssertionStatus(String className, boolean enabled) | 为此类加载器中的命名顶级类和其中包含的任何嵌套类设置所需的断言状态。 |
void | setDefaultAssertionStatus(boolean enabled) | 设置此类加载器的默认断言状态。 |
void | setPackageAssertionStatus(String packageName, boolean enabled) | 设置命名包的包默认断言状态。 |
protected void | setSigners(Class<?> c, Object[] signers) | 设置类的签名者。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造函数详细信息
ClassLoader
protected ClassLoader(ClassLoader parent)
使用指定的父类加载器为委托创建一个新的类加载器。
如果存在安全管理器,则调用其 SecurityManager#checkCreateClassLoader() 方法。 这可能会导致安全异常。
参数:
参数名称 | 参数描述 |
---|---|
parent | 父类加载器 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建新的类加载器。 |
ClassLoader
protected ClassLoader()
使用 getSystemClassLoader() 方法返回的 ClassLoader 作为父类加载器创建一个新的类加载器。
如果存在安全管理器,则调用其 SecurityManager#checkCreateClassLoader() 方法。 这可能会导致安全异常。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建新的类加载器。 |
方法详情
loadClass
public Class<?> loadClass(String name) throws ClassNotFoundException
加载具有指定二进制名称的类。 此方法以与 loadClass(java.lang.String,boolean) 方法相同的方式搜索类。 Java 虚拟机调用它来解析类引用。 调用此方法等效于调用 loadClass(name, false)。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的二进制名称 |
返回:
生成的 Class 对象
Throws:
Throw名称 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到类 |
loadClass
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
加载具有指定二进制名称的类。 此方法的默认实现按以下顺序搜索类:
- 调用 findLoadedClass(java.lang.String) 检查类是否已经加载。
- 在父类加载器上调用 loadClass 方法。 如果 parent 为 null,则使用虚拟机内置的类加载器。
- 调用 findClass(java.lang.String) 方法查找类。
如果使用上述步骤找到了类,并且解析标志为真,则此方法将在生成的 Class 对象上调用 resolveClass(java.lang.Class) 方法。
鼓励 ClassLoader 的子类覆盖 findClass(java.lang.String),而不是这个方法。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的二进制名称 |
resolve | 如果为真,则解析该类 |
返回:
生成的 Class 对象
Throws:
Throw名称 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到类 |
findClass
protected Class<?> findClass(String name) throws ClassNotFoundException
查找具有指定二进制名称的类。 这个方法应该被遵循委托模型加载类的类加载器实现覆盖,并且在检查请求的类的父类加载器后由 loadClass 方法调用。 默认实现会引发 ClassNotFoundException。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的二进制名称 |
返回:
生成的 Class 对象
Throws:
Throw名称 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到类 |
defineClass
@Deprecated protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
已弃用。 替换为 [defineClass(String, byte], int, int)
将字节数组转换为 Class 类的实例。 在使用该类之前,必须先解决它。 此方法已弃用,取而代之的是采用二进制名称作为其第一个参数的版本,并且更安全。
参数:
参数名称 | 参数描述 |
---|---|
b | 构成类数据的字节。 off 到 off+len-1 位置的字节应具有《Java™ 虚拟机规范》定义的有效类文件的格式。 |
off | 类数据在 b 中的起始偏移量 |
len | 类数据的长度 |
返回:
从指定的类数据创建的 Class 对象
Throws:
Throw名称 | Throw描述 |
---|---|
ClassFormatError | 如果数据不包含有效的类 |
IndexOutOfBoundsException | 如果 off 或 len 为负数,或者 off+len 大于 b.length。 |
SecurityException | 如果尝试将此类添加到包含由与此类不同的证书集签名的类的包中,或者尝试在包中定义具有以开头的完全限定名称的类 “java”。 |
defineClass
protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError
将字节数组转换为 Class 类的实例。 在使用该类之前,必须先解决它。
此方法将默认 ProtectionDomain 分配给新定义的类。 当调用 Policy.getPolicy().getPermissions(new CodeSource(null, null)) 时,ProtectionDomain 被有效地授予了相同的权限集。 默认域在第一次调用 defineClass 时创建,并在后续调用中重用。
要将特定的 ProtectionDomain 分配给类,请使用将 ProtectionDomain 作为其参数之一的 defineClass 方法。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的预期二进制名称,如果未知,则为 null |
b | 构成类数据的字节。 off 到 off+len-1 位置的字节应具有《Java™ 虚拟机规范》定义的有效类文件的格式。 |
off | 类数据在 b 中的起始偏移量 |
len | 类数据的长度 |
返回:
从指定的类数据创建的 Class 对象。
Throws:
Throw名称 | Throw描述 |
---|---|
ClassFormatError | 如果数据不包含有效的类 |
IndexOutOfBoundsException | 如果 off 或 len 为负数,或者 off+len 大于 b.length。 |
SecurityException | 如果尝试将此类添加到包含由与此类不同的证书集(未签名)签名的类的包中,或者名称以“java.”开头。 |
defineClass
protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
使用可选的 ProtectionDomain 将字节数组转换为 Class 类的实例。如果域为空,则将按照 [defineClass(java.lang.String,byte],int,int) 的文档中的规定为类分配一个默认域。在使用该类之前,必须先解决它。
包中定义的第一个类确定了该包中定义的所有后续类必须包含的确切证书集。类的证书集是从类的 ProtectionDomain 中的 CodeSource 获得的。添加到该包的任何类都必须包含相同的证书集,否则将引发 SecurityException。请注意,如果 name 为 null,则不执行此检查。您应该始终传入您定义的类的二进制名称以及字节。这可以确保您定义的类确实是您认为的类。
指定的名称不能以“java.”开头,因为“java.*”包中的所有类只能由引导类加载器定义。如果名称不为空,则它必须等于指定的类的二进制名称字节数组“b”,否则会抛出 NoClassDefFoundError。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的预期二进制名称,如果未知,则为 null |
b | 构成类数据的字节。 off 到 off+len-1 位置的字节应具有《Java™ 虚拟机规范》定义的有效类文件的格式。 |
off | 类数据在 b 中的起始偏移量 |
len | 类数据的长度 |
protectionDomain | 类的保护域 |
返回:
从数据创建的 Class 对象,以及可选的 ProtectionDomain。
Throws:
Throw名称 | Throw描述 |
---|---|
ClassFormatError | 如果数据不包含有效的类 |
NoClassDefFoundError | 如果 name 不等于 b 指定的类的二进制名称 |
IndexOutOfBoundsException | 如果 off 或 len 为负数,或者 off+len 大于 b.length。 |
SecurityException | 如果尝试将此类添加到包含由与此类不同的证书集签名的类的包中,或者名称以“java.”开头。 |
defineClass
protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
使用可选的 ProtectionDomain 将 ByteBuffer 转换为 Class 类的实例。 如果域为空,则将按照 [defineClass(java.lang.String,byte],int,int) 的文档中的规定为类分配一个默认域。 在使用该类之前,必须先解决它。
关于包中定义的第一个类的规则确定包的证书集,以及对类名的限制与 [defineClass(java.lang.String,byte],int,int, java.security.ProtectionDomain)。
调用 cl.defineClass(name, bBuffer, pd) 形式的此方法会产生与语句完全相同的结果
… byte[] temp = new byte[bBuffer.remaining()]; bBuffer.get(temp); return cl.defineClass(name, temp, 0, temp.length, pd);
参数:
参数名称 | 参数描述 |
---|---|
name | 预期的二进制名称。 如果不知道,则为 null |
b | 构成类数据的字节。 从位置 b.position() 到 b.position() + b.limit() -1 的字节应具有《Java™ 虚拟机规范》定义的有效类文件的格式。 |
protectionDomain | 类的 ProtectionDomain 或 null。 |
返回:
从数据创建的 Class 对象,以及可选的 ProtectionDomain。
Throws:
Throw名称 | Throw描述 |
---|---|
ClassFormatError | 如果数据不包含有效的类。 |
NoClassDefFoundError | 如果 name 不等于 b 指定的类的二进制名称 |
SecurityException | 如果尝试将此类添加到包含由与此类不同的证书集签名的类的包中,或者名称以“java.”开头。 |
resolveClass
protected final void resolveClass(Class<?> c)
链接指定的类。 类加载器可以使用这个(误导性的)方法来链接一个类。 如果类 c 已经被链接,那么这个方法简单地返回。 否则,该类将按照《Java™ 语言规范》的“执行”一章中的说明进行链接。
参数:
参数名称 | 参数描述 |
---|---|
c | 要链接的类 |
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 c 为空。 |
findSystemClass
protected final Class<?> findSystemClass(String name) throws ClassNotFoundException
查找具有指定二进制名称的类,并在必要时加载它。
此方法通过系统类加载器加载类(参见 getSystemClassLoader())。 返回的 Class 对象可能有多个与之关联的 ClassLoader。 ClassLoader 的子类通常不需要调用此方法,因为大多数类加载器只需要覆盖 findClass(java.lang.String)。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的二进制名称 |
返回:
指定名称的 Class 对象
Throws:
Throw名称 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到类 |
findLoadedClass
protected final Class<?> findLoadedClass(String name)
如果 Java 虚拟机将此加载器记录为具有该二进制名称的类的初始加载器,则返回具有给定二进制名称的类。 否则返回 null。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的二进制名称 |
返回:
Class 对象,如果尚未加载该类,则为 null
setSigners
protected final void setSigners(Class<?> c, Object[] signers)
设置类的签名者。 这应该在定义一个类之后调用。
参数:
参数名称 | 参数描述 |
---|---|
c | 类对象 |
signers | 类的签名者 |
getResource
public URL getResource(String name)
查找具有给定名称的资源。 资源是可以由类代码以独立于代码位置的方式访问的一些数据(图像、音频、文本等)。
资源的名称是一个以“/”分隔的路径名,用于标识该资源。
该方法将首先在父类加载器中搜索资源; 如果 parent 为 null,则搜索虚拟机内置的类加载器的路径。 如果失败,此方法将调用 findResource(java.lang.String) 来查找资源。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的 URL 对象,如果找不到资源或调用者没有足够的权限来获取资源,则返回 null。
getResources
public EnumerationURL getResources(String name) throws IOException
查找具有给定名称的所有资源。 资源是可以由类代码以独立于代码位置的方式访问的一些数据(图像、音频、文本等)。
资源的名称是标识资源的 / 分隔的路径名。
getResource(java.lang.String) 的文档中描述了搜索顺序。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
资源的 URL 对象的枚举。 如果找不到资源,则枚举将为空。 类加载器无权访问的资源不会出现在枚举中。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误 |
findResource
protected URL findResource(String name)
查找具有给定名称的资源。 类加载器实现应覆盖此方法以指定在何处查找资源。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的 URL 对象,如果找不到资源,则返回 null
findResources
protected EnumerationURL findResources(String name) throws IOException
返回代表具有给定名称的所有资源的 URL 对象的枚举。 类加载器实现应覆盖此方法以指定从何处加载资源。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
资源的 URL 对象的枚举
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误 |
registerAsParallelCapable
protected static boolean registerAsParallelCapable()
将调用者注册为具有并行能力。 当且仅当满足以下所有条件时,注册成功:
- 没有创建调用者实例
- 调用者的所有超类(Object 类除外)都注册为具有并行能力
请注意,一旦类加载器注册为具有并行能力,就无法将其更改回来。
返回:
如果调用者成功注册为具有并行能力,则为 true,否则为 false。
getSystemResource
public static URL getSystemResource(String name)
从用于加载类的搜索路径中查找指定名称的资源。 此方法通过系统类加载器定位资源(请参阅 getSystemClassLoader())。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的 URL 对象,如果找不到资源,则返回 null
getSystemResources
public static EnumerationURL getSystemResources(String name) throws IOException
从用于加载类的搜索路径中查找指定名称的所有资源。 这样找到的资源作为 URL 对象的枚举返回。
getSystemResource(java.lang.String) 的文档中描述了搜索顺序。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
资源 URL 对象的枚举
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误 |
getResourceAsStream
public InputStream getResourceAsStream(String name)
返回用于读取指定资源的输入流。
getResource(java.lang.String) 的文档中描述了搜索顺序。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的输入流,如果找不到资源,则返回 null
getSystemResourceAsStream
public static InputStream getSystemResourceAsStream(String name)
打开读取,从用于加载类的搜索路径中指定名称的资源。 此方法通过系统类加载器定位资源(请参阅 getSystemClassLoader())。
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的输入流,如果找不到资源,则返回 null
getParent
public final ClassLoader getParent()
返回委托的父类加载器。 一些实现可能使用 null 来表示引导类加载器。 如果此类加载器的父级是引导类加载器,则此方法将在此类实现中返回 null。
如果存在安全管理器,并且调用者的类加载器不为 null 并且不是此类加载器的祖先,则此方法使用 RuntimePermission#RuntimePermission(String) 调用安全管理器的 SecurityManager#checkPermission(java.security.Permission) 方法 ) 允许验证对父类加载器的访问权限。 如果没有,将抛出 SecurityException。
返回:
父类加载器
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许访问此类加载器的父类加载器。 |
getSystemClassLoader
public static ClassLoader getSystemClassLoader()
返回委托的系统类加载器。这是新 ClassLoader 实例的默认委托父级,通常是用于启动应用程序的类加载器。
此方法首先在运行时启动序列的早期调用,此时它创建系统类加载器并将其设置为调用线程的上下文类加载器。
默认系统类加载器是此类的依赖于实现的实例。
如果在第一次调用此方法时定义了系统属性“java.system.class.loader”,则该属性的值将被视为将作为系统类加载器返回的类的名称。该类使用默认的系统类加载器加载,并且必须定义一个公共构造函数,该构造函数接受一个 ClassLoader 类型的参数,该参数用作委托父级。然后使用此构造函数创建一个实例,并将默认系统类加载器作为参数。生成的类加载器被定义为系统类加载器。
如果存在安全管理器,并且调用者的类加载器不为空,并且调用者的类加载器与系统类加载器的祖先不同,则此方法调用安全管理器的 SecurityManager#checkPermission(java.security.Permission ) 方法具有 RuntimePermission#RuntimePermission(String) 权限来验证对系统类加载器的访问。如果没有,将抛出 SecurityException。
返回:
用于委托的系统 ClassLoader,如果没有则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许访问系统类加载器。 |
IllegalStateException | 如果在构造由“java.system.class.loader”属性指定的类加载器期间递归调用。 |
Error | 如果定义了系统属性“java.system.class.loader”但无法加载命名类,则提供程序类未定义所需的构造函数,或者该构造函数在调用时抛出异常。 可以通过 Throwable#getCause() 方法检索错误的根本原因。 |
definePackage
protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) throws IllegalArgumentException
在此 ClassLoader 中按名称定义包。 这允许类加载器为其类定义包。 必须在定义类之前创建包,并且包名称在类加载器中必须是唯一的,并且一旦创建就不能重新定义或更改。
参数:
参数名称 | 参数描述 |
---|---|
name | 包名 |
specTitle | 规范标题 |
specVersion | 规范版本 |
specVendor | 规范厂商 |
implTitle | 实施标题 |
implVersion | 实施版本 |
implVendor | 实施厂商 |
sealBase | 如果不为 null,则此包相对于给定的代码源 URL 对象是密封的。 否则,包装不密封。 |
返回:
新定义的 Package 对象
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果包名称与此类加载器或其祖先之一中的现有包重复 |
getPackage
protected Package getPackage(String name)
返回已由此类加载器或其任何祖先定义的包。
参数:
参数名称 | 参数描述 |
---|---|
name | 包名 |
返回:
与给定名称对应的包,如果未找到,则返回 null
getPackages
protected Package[] getPackages()
返回此类加载器及其祖先定义的所有包。
返回:
此 ClassLoader 定义的 Package 对象数组
findLibrary
protected String findLibrary(String libname)
返回本机库的绝对路径名。 VM 调用此方法来定位属于使用此类加载器加载的类的本机库。 如果此方法返回 null,VM 将沿着指定为“java.library.path”属性的路径搜索库。
参数:
参数名称 | 参数描述 |
---|---|
libname | 图书馆名称 |
返回:
本机库的绝对路径
setDefaultAssertionStatus
public void setDefaultAssertionStatus(boolean enabled)
设置此类加载器的默认断言状态。 此设置确定由此类加载器加载并在将来初始化的类是否默认启用或禁用断言。 通过调用 setPackageAssertionStatus(java.lang.String,boolean) 或 setClassAssertionStatus(java.lang.String,boolean),可以在每个包或每个类的基础上覆盖此设置。
参数:
参数名称 | 参数描述 |
---|---|
enabled | 如果此类加载器加载的类今后将默认启用断言,则为 true;如果默认情况下禁用断言,则为 false。 |
setPackageAssertionStatus
public void setPackageAssertionStatus(String packageName, boolean enabled)
设置命名包的包默认断言状态。 包默认断言状态决定了将来初始化的属于指定包或其任何“子包”的类的断言状态。
名为 p 的包的子包是名称以“p.”开头的任何包。 例如 javax.swing.text 是 javax.swing 的子包,java.util 和 java.lang.reflect 都是 java 的子包。
如果多个包默认值适用于给定类,则属于最特定包的包默认值优先于其他包。 例如,如果 javax.lang 和 javax.lang.reflect 都有与之关联的包默认值,则后一个包默认值适用于 javax.lang.reflect 中的类。
包默认值优先于类加载器的默认断言状态,并且可以通过调用 setClassAssertionStatus(java.lang.String,boolean) 在每个类的基础上覆盖。
参数:
参数名称 | 参数描述 |
---|---|
packageName | 要设置其包默认断言状态的包的名称。 空值表示“当前”的未命名包(请参阅《Java™ 语言规范》的第 7.4.2 节。) |
enabled | 如果此类加载器加载的属于命名包或其任何子包的类默认启用断言,则返回 true;如果默认禁用断言,则返回 false。 |
setClassAssertionStatus
public void setClassAssertionStatus(String className, boolean enabled)
为此类加载器中的命名顶级类和其中包含的任何嵌套类设置所需的断言状态。 此设置优先于类加载器的默认断言状态,以及任何适用的每个包的默认值。 如果命名类已经初始化,则此方法无效。 (一旦一个类被初始化,它的断言状态就不能改变。)
如果命名类不是顶级类,则此调用不会影响任何类的实际断言状态。
参数:
参数名称 | 参数描述 |
---|---|
className | 要设置其断言状态的顶级类的完全限定类名。 |
enabled | 如果命名类在初始化时(如果)要启用断言,则为 true,如果要禁用该类的断言,则为 false。 |
clearAssertionStatus
public void clearAssertionStatus()
将此类加载器的默认断言状态设置为 false 并丢弃与类加载器关联的任何包默认值或类断言状态设置。 提供此方法是为了使类加载器可以忽略任何命令行或持久断言状态设置并“从头开始”。