鸿蒙OS ClassLoader

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

加载具有指定二进制名称的类。 此方法的默认实现按以下顺序搜索类:

  1. 调用 findLoadedClass(java.lang.String) 检查类是否已经加载。
  2. 在父类加载器上调用 loadClass 方法。 如果 parent 为 null,则使用虚拟机内置的类加载器。
  3. 调用 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()

将调用者注册为具有并行能力。 当且仅当满足以下所有条件时,注册成功:

  1. 没有创建调用者实例
  2. 调用者的所有超类(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 并丢弃与类加载器关联的任何包默认值或类断言状态设置。 提供此方法是为了使类加载器可以忽略任何命令行或持久断言状态设置并“从头开始”。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《鸿蒙OS ClassLoader》
文章链接:https://zhuji.vsping.com/313316.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。