JavaTM 2 Platform
Standard Ed. 5.0

java.lang
类 ClassLoader

java.lang.Object
  继承者 java.lang.ClassLoader

public abstract class ClassLoader
extends Object

类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。

每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。

数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。

应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式。

类加载器通常由安全管理器使用,用于指示安全域。

ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作 ClassLoader 实例的父类加载器。

通常情况下,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
              . . .
         }
     }
 

二进制名称

按照《Java Language Specification》的定义,任何作为 String 类型参数传递给 ClassLoader 中方法的类名称都必须是一个二进制名称。

有效类名称的示例包括:

   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"
 

从以下版本开始:
1.0
另请参见:
resolveClass(Class)

构造方法摘要
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, java.security.ProtectionDomain protectionDomain)
          使用可选的 ProtectionDomain 将一个字节数组转换为 Class 类的实例。
protected  Class<?> defineClass(String name, java.nio.ByteBuffer b, java.security.ProtectionDomain protectionDomain)
          使用可选的 ProtectionDomain 将 ByteBuffer 转换为 Class 类的实例。
protected  Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, java.net.URL sealBase)
          使用此 ClassLoader 中的名称来定义包。
protected  Class<?> findClass(String name)
          使用指定的二进制名称查找类。
protected  String findLibrary(String libname)
          返回本机库的绝对路径名。
protected  Class<?> findLoadedClass(String name)
          如果 Java 虚拟机已将此加载器记录为具有给定二进制名称的某个类的启动加载器,则返回该二进制名称的类。
protected  java.net.URL findResource(String name)
          查找具有给定名称的资源。
protected  Enumeration<java.net.URL> findResources(String name)
          返回表示所有具有给定名称的资源的 URL 对象的枚举。
protected  Class<?> findSystemClass(String name)
          查找具有指定的二进制名称的类,必要时加载它。
protected  Package getPackage(String name)
          返回由此类加载器或其任何祖先所定义的 Package。
protected  Package[] getPackages()
          返回此类加载器及其祖先所定义的所有 Package。
 ClassLoader getParent()
          返回委托的父类加载器。
 java.net.URL getResource(String name)
          查找具有给定名称的资源。
 InputStream getResourceAsStream(String name)
          返回读取指定资源的输入流。
 Enumeration<java.net.URL> getResources(String name)
          查找所有给定名称的资源。
static ClassLoader getSystemClassLoader()
          返回委托的系统类加载器。
static java.net.URL getSystemResource(String name)
          从用来加载类的搜索路径中查找具有指定名称的资源。
static InputStream getSystemResourceAsStream(String name)
          从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。
static Enumeration<java.net.URL> getSystemResources(String name)
          从用来加载类的搜索路径中查找所有具有指定名称的资源。
 Class<?> loadClass(String name)
          使用指定的二进制名称来加载类。
protected  Class<?> loadClass(String name, boolean resolve)
          使用指定的二进制名称来加载类。
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)
使用指定的、用于委托操作的父类加载器创建新的类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

参数:
parent - 父类加载器
抛出:
SecurityException - 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建新的类加载器。
从以下版本开始:
1.2

ClassLoader

protected ClassLoader()
使用方法 getSystemClassLoader() 返回的 ClassLoader 创建一个新的类加载器,将该加载器作为父类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

抛出:
SecurityException - 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建新的类加载器。
方法详细信息

loadClass

public Class<?> loadClass(String name)
                   throws ClassNotFoundException
使用指定的二进制名称来加载类。此方法使用与 loadClass(String, boolean) 方法相同的方式搜索类。Java 虚拟机调用它来分析类引用。调用此方法等效于调用 loadClass(name, false)。

参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果没有找到类

loadClass

protected Class<?> loadClass(String name,
                             boolean resolve)
                      throws ClassNotFoundException
使用指定的二进制名称来加载类。此方法的默认实现将按以下顺序搜索类:

  1. 调用 findLoadedClass(String) 来检查是否已经加载类。

  2. 在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。

  3. 调用 findClass(String) 方法查找类。

如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用 resolveClass(Class) 方法。

鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。

参数:
name - 类的二进制名称
resolve - 如果该参数为 true,则分析这个类
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类

findClass

protected Class<?> findClass(String name)
                      throws ClassNotFoundException
使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。

参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类
从以下版本开始:
1.2

defineClass

@Deprecated
protected final Class<?> defineClass(byte[] b,
                                                int off,
                                                int len)
                              throws ClassFormatError
已过时。 由 defineClass(String, byte[], int, int) 取代

将一个字节数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。此方法已废弃,新版本将二进制名称作为该类的第一个参数,后者更加安全。

参数:
b - 组成类数据的字节。off 与 off+len-1 之间的字节应该具有《Java Virtual Machine Specification》定义的有效类文件的格式。
off - 类数据的 b 中的起始偏移量
len - 类数据的长度
返回:
从指定类数据创建的 Class 对象
抛出:
ClassFormatError - 如果数据不包含有效类
IndexOutOfBoundsException - 如果 off 或 len 为负,或者如果 off+len 大于 b.length。
另请参见:
loadClass(String, boolean), resolveClass(Class)

defineClass

protected final Class<?> defineClass(String name,
                                     byte[] b,
                                     int off,
                                     int len)
                              throws ClassFormatError
将一个字节数组转换为 Class 类的实例。必须分析 Class,然后才能使用它。

此方法将默认的 ProtectionDomain 分配给新定义的类。调用 Policy.getPolicy().getPermissions(new CodeSource(null, null)) 时,ProtectionDomain 被有效授予所返回的相同权限集。默认域在第一次调用 defineClass 时创建,并在后续调用时被重用。

要将特定的 ProtectionDomain 分配给类,需要使用 defineClass 方法,该方法将 ProtectionDomain 用作其参数之一。

参数:
name - 所需要的类的二进制名称,如果不知道此名称,则该参数为 null
b - 组成类数据的字节。off 与 off+len-1 之间的字节应该具有《Java Virtual Machine Specification》定义的有效类文件的格式。
off - 类数据的 b 中的起始偏移量
len - 类数据的长度
返回:
从指定类数据中创建的 Class 对象。
抛出:
ClassFormatError - 如果数据不包含有效类
IndexOutOfBoundsException - 如果 off 或 len 为负,或者如果 off+len 大于 b.length。
SecurityException - 如果试图将此类添加到包含由不同证书集签名的类(而不是此类,此类未签名)的包中,或者如果 name 以 "java." 开头。
从以下版本开始:
1.1
另请参见:
loadClass(String, boolean), resolveClass(Class), CodeSource, SecureClassLoader

defineClass

protected final Class<?> defineClass(String name,
                                     byte[] b,
                                     int off,
                                     int len,
                                     java.security.ProtectionDomain protectionDomain)
                              throws ClassFormatError
使用可选的 ProtectionDomain 将一个字节数组转换为 Class 类的实例。如果该域为 null,则将默认域分配给 defineClass(String, byte[], int, int) 的文档中指定的类。这个类必须分析后才能使用。

包中定义的第一个类确定在该包中定义的所有后续类必须包含的证书的确切集合。从该类的 ProtectionDomain 中的 CodeSource 可以获得类的证书集合。添加到该包中的任何类都必须包含相同的证书集合,否则抛出 SecurityException 异常。注意,如果 name 为 null,则不执行该检查。应该始终传入要定义的类的二进制名称以及字节。这可确保定义该类的正确性。

指定的 name 不能以 "java." 开头,因为 "java.*" 包中的所有类都只能由引导类加载器定义。如果 name 不是 null,则它必定等于由字节数组 "b" 指定的类的二进制名称,否则将抛出 NoClassDefFoundError。

参数:
name - 所需类的二进制名称,如果不知道此名称,则该参数为 null
b - 组成类数据的字节。从 off 到 off+len-1 的字节应该具有由《Java Virtual Machine Specification》定义的有效类文件的格式。
off - 类数据的 b 中的起始偏移量
len - 类数据的长度
protectionDomain - 类的 ProtectionDomain
返回:
从数据中创建的 Class 对象和可选的 ProtectionDomain。
抛出:
ClassFormatError - 如果数据不包含有效的类
NoClassDefFoundError - 如果 name 不等于 b 指定的类的二进制名称。
IndexOutOfBoundsException - 如果 off 或者 len 为负,或者如果 off+len 大于 b.length。
SecurityException - 如果试图将此类添加到某个包中,而这个包中包含由不同证书集合(而不是该类)签名的类,或者如果 name 以 "java." 开头。

defineClass

protected final Class<?> defineClass(String name,
                                     java.nio.ByteBuffer b,
                                     java.security.ProtectionDomain protectionDomain)
                              throws ClassFormatError
使用可选的 ProtectionDomain 将 ByteBuffer 转换为 Class 类的实例。如果该域为 null,则将默认域分配给 defineClass(String, byte[], int, int) 的文档中指定的类。这个类必须分析后才能使用。

有关包中定义的第一个类(它确定了包的证书集合)的规则,以及对类名称的限制,都与 defineClass(String, byte[], int, int, 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 Virtual Machine Specification》定义的有效类文件的格式。
protectionDomain - 类的 ProtectionDomain,或为 null。
返回:
从数据中创建的 Class 对象和可选的 ProtectionDomain。
抛出:
ClassFormatError - 如果数据不包含有效的类。
NoClassDefFoundError - 如果 name 不等于 b 指定的类的二进制名称。
SecurityException - 如果试图将此类添加到某个包中,而这个包中包含由不同证书集合(而不是该类)签名的类,或者如果 name 以 "java." 开头。
从以下版本开始:
1.5
另请参见:
defineClass(String, byte[], int, int, ProtectionDomain)

resolveClass

protected final void resolveClass(Class<?> c)
链接指定的类。类加载器可以使用此方法(其名称容易使人误解)来链接类。如果已经链接类 c,则仅返回此方法。否则,该类就按《Java Language Specification》中 "Execution" 一章所描述的进行链接。

参数:
c - 要链接的类
抛出:
NullPointerException - 如果 c 为 null。
另请参见:
defineClass(String, byte[], int, int)

findSystemClass

protected final Class<?> findSystemClass(String name)
                                  throws ClassNotFoundException
查找具有指定的二进制名称的类,必要时加载它。

此方法通过系统类加载器(参见 getSystemClassLoader())来加载该类。返回的 Class 对象具有多个与之相关联的 ClassLoader。ClassLoader 的子类通常不必调用此方法,因为大多数类加载器只需重写 findClass(String) 即可。

参数:
name - 类的二进制名称
返回:
指定 name 的 Class 对象
抛出:
ClassNotFoundException - 如果找不到类
另请参见:
ClassLoader(ClassLoader), getParent()

findLoadedClass

protected final Class<?> findLoadedClass(String name)
如果 Java 虚拟机已将此加载器记录为具有给定二进制名称的某个类的启动加载器,则返回该二进制名称的类。否则,返回 null。

参数:
name - 类的二进制名称
返回:
Class 对象,如果类没有被加载,则返回 null
从以下版本开始:
1.1

setSigners

protected final void setSigners(Class<?> c,
                                Object[] signers)
设置类的签署者。应该在定义类后调用此方法。

参数:
c - Class 对象
signers - 类的签署者
从以下版本开始:
1.1

getResource

public java.net.URL getResource(String name)
查找具有给定名称的资源。资源是可以通过类代码以与代码位置无关的方式访问的一些数据(图像、声音、文本等)。

资源名称是以 '/' 分隔的标识资源的路径名称。

此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。如果搜索失败,则此方法将调用 findResource(String) 来查找资源。

参数:
name - 资源名称
返回:
读取资源的 URL 对象,或者如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。
从以下版本开始:
1.1

getResources

public Enumeration<java.net.URL> getResources(String name)
                                       throws IOException
查找所有给定名称的资源。资源是可以通过类代码以与代码位置无关的方式访问的某些数据(图像、声音、文本等)。

资源名称是以 '/' 分隔的标识资源的路径名称。

getResource(String) 的文档中描述了搜索顺序。

参数:
name - 资源名称
返回:
资源的 URL 对象的枚举。如果找不到资源,则该枚举将为空。类加载器无权访问的资源不在此枚举中。
抛出:
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2
另请参见:
findResources(String)

findResource

protected java.net.URL findResource(String name)
查找具有给定名称的资源。类加载器实现应该重写此方法,以指定从何处查找资源。

参数:
name - 资源名称
返回:
用于读取资源的 URL 对象,或者如果无法找到资源,则返回 null
从以下版本开始:
1.2

findResources

protected Enumeration<java.net.URL> findResources(String name)
                                           throws IOException
返回表示所有具有给定名称的资源的 URL 对象的枚举。类加载器实现应该重写此方法,以指定从何处加载资源。

参数:
name - 资源名称
返回:
资源的 URL 对象的枚举
抛出:
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2

getSystemResource

public static java.net.URL getSystemResource(String name)
从用来加载类的搜索路径中查找具有指定名称的资源。此方法通过系统类加载器(参见 getSystemClassLoader())来查找资源。

参数:
name - 资源名称
返回:
用于读取资源的 URL 对象,如果找不到资源,则返回 null
从以下版本开始:
1.1

getSystemResources

public static Enumeration<java.net.URL> getSystemResources(String name)
                                                    throws IOException
从用来加载类的搜索路径中查找所有具有指定名称的资源。找到的资源作为 URL 对象的 Enumeration 返回。

getSystemResource(String) 的文档中描述了搜索顺序。

参数:
name - 资源名称
返回:
资源 URL 对象的枚举
抛出:
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2

getResourceAsStream

public InputStream getResourceAsStream(String name)
返回读取指定资源的输入流。

getResource(String) 的文档中描述了搜索顺序。

参数:
name - 资源名称
返回:
用于读取资源的输入流,如果无法找到资源,则返回 null
从以下版本开始:
1.1

getSystemResourceAsStream

public static InputStream getSystemResourceAsStream(String name)
从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。此方法通过系统类加载器(参见 getSystemClassLoader())来查找资源。

参数:
name - 资源名称
返回:
用于读取资源的输入流,如果无法找到资源,则返回 null
从以下版本开始:
1.1

getParent

public final ClassLoader getParent()
返回委托的父类加载器。一些实现可能使用 null 来表示引导类加载器。如果类加载器的父类加载器就是引导类加载器,则此方法将在这样的实现中返回 null。

如果存在安全管理器,且调用者的类加载器既不是 null,也不是此类加载器的祖先,那么此方法将使用 RuntimePermission("getClassLoader") 权限调用安全管理器的 checkPermission 方法,以检验是否允许访问该类的父类加载器。如果无此权限,则抛出 SecurityException 异常。

返回:
父级 ClassLoader
抛出:
SecurityException - 如果存在安全管理器,并且其 checkPermission 方法不允许访问此类加载器的父类加载器。
从以下版本开始:
1.2

getSystemClassLoader

public static ClassLoader getSystemClassLoader()
返回委托的系统类加载器。该加载器是新的 ClassLoader 实例的默认委托父类加载器,通常是用来启动应用程序的类加载器。

在运行时启动序列的早期首先调用此方法,这时会创建系统类加载器并将其设置为调用 Thread 的上下文类加载器。

默认的系统类加载器是此类的一个与实现有关的实例。

如果在第一次调用此方法时定义系统属性 "java.system.class.loader",那么该属性的值就是将作为系统类加载器返回的那个类的名称。该类是使用默认系统类加载器进行加载的,它必须定义一个公共的构造方法,此构造方法带有用作委托父类加载器的 ClassLoader 类型的单个参数。然后可以使用将默认系统类加载器用作参数的此构造方法创建一个实例。得到的类加载器被定义为系统类加载器。

如果存在安全管理器,且调用者的类加载器既不是 null,也不同于或不是系统类加载器的祖先,那么该方法将使用 RuntimePermission("getClassLoader") 权限调用安全管理器的 checkPermission 方法,以检验系统类加载器的访问权。如果无此权限,则抛出 SecurityException 异常。

返回:
委托的系统 ClassLoader,如果没有这样的类加载器,则返回 null
抛出:
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,
                                java.net.URL sealBase)
                         throws IllegalArgumentException
使用此 ClassLoader 中的名称来定义包。这允许类加载器定义用于它们的类的包。包必须在定义类之前创建,包名在类加载器中必须惟一,并且一旦创建就不能重新定义或更改。

参数:
name - 包名
specTitle - 规范标题
specVersion - 规范版本
specVendor - 规范供应商
implTitle - 实现标题
implVersion - 实现版本
implVendor - 实现供应商
sealBase - 如果不为 null,那么将此包对于给定代码源 URL 对象是密封的。否则,不密封此包。
返回:
新定义的 Package 对象
抛出:
IllegalArgumentException - 如果包名与此类加载器或其某个祖先中的现有包的名称重复
从以下版本开始:
1.2

getPackage

protected Package getPackage(String name)
返回由此类加载器或其任何祖先所定义的 Package。

参数:
name - 包名
返回:
与给定名称相对应的 Package;如果没有这样的包,则返回 null
从以下版本开始:
1.2

getPackages

protected Package[] getPackages()
返回此类加载器及其祖先所定义的所有 Package。

返回:
此 ClassLoader 定义的 Package 对象的数组
从以下版本开始:
1.2

findLibrary

protected String findLibrary(String libname)
返回本机库的绝对路径名。虚拟机 (VM) 调用此方法来查找那些属于利用此类加载器加载的类的本机库。如果此方法返回 null,则虚拟机沿指定为 "java.library.path" 属性的路径搜索该库。

参数:
libname - 库名称
返回:
本机库的绝对路径
从以下版本开始:
1.2
另请参见:
System.loadLibrary(String), System.mapLibraryName(String)

setDefaultAssertionStatus

public void setDefaultAssertionStatus(boolean enabled)
设置此类加载器的默认断言状态。此设置确定由此类加载器加载并在将来初始化的类在默认情况下是启用还是禁用断言。通过调用 setPackageAssertionStatus(String, boolean) 或 setClassAssertionStatus(String, boolean),在每个包或每个类上重写此设置。

参数:
enabled - 如果由此类加载器加载的类将默认为启用断言,则该参数为 true;如果默认为禁用断言,则该参数为 false。
从以下版本开始:
1.4

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(String, boolean) 在每个类的基础上进行重写。

参数:
packageName - 要设置其默认包断言状态的包名。null 值指示未命名的包为“当前”状态(《Java Language Specification》的第 7.4.2 节)。
enabled - 如果由此类加载器加载并属于指定包或其子包的类在默认情况下启用断言,则该参数为 true;如果在默认情况下禁用断言,则该参数为 false。
从以下版本开始:
1.4

setClassAssertionStatus

public void setClassAssertionStatus(String className,
                                    boolean enabled)
设置在此类加载器及其包含的嵌套类中指定的最高层类所需的断言状态。该设置的优先级高于类加载器的默认断言状态以及可用的任何包的默认值。如果已经初始化指定类,则此方法无效。(初始化类后,其断言状态无法再改变。)

如果指定类不是最高层的类,则此调用对任何类的实际断言都无效,并且其返回值也是不确定的。

参数:
className - 将要设置其断言状态的最高层类的完全限定类名。
enabled - 如果指定类在初始化时启用断言,则该参数为true;如果该类禁用断言,则该参数为false。
从以下版本开始:
1.4

clearAssertionStatus

public void clearAssertionStatus()
将此类加载器的默认断言状态设置为 false,并放弃与此类加载器关联的所有默认包或类断言状态设置。提供此方法可以让类加载器忽略任何命令行或持久断言状态设置,并且“无不良记录”。

从以下版本开始:
1.4

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。