模块  java.base
软件包  java.lang

Class ClassLoader

  • 已知直接子类:
    SecureClassLoader

    public abstract class ClassLoader
    extends Object
    类加载器是一个负责加载类的对象。 ClassLoader类是一个抽象类。 给定类的binary name ,类加载器应该尝试定位或生成构成类定义的数据。 典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。

    每个对象包含一个referenceClassLoader定义它。

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

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

    安全管理器通常可以使用类加载器来指示安全域。

    除了加载类之外,类加载器还负责定位资源。 资源是一些数据(例如“ .class ”文件,配置数据或图像),用抽象的“/”分隔的路径名称标识。 资源通常与应用程序或库打包在一起,以便可以通过应用程序或库中的代码来定位它们。 在某些情况下,会包含资源,以便其他库可以找到它们。

    ClassLoader类使用委派模型来搜索类和资源。 ClassLoader每个实例都有一个关联的父类加载器。 当请求查找类或资源时, ClassLoader实例通常会在尝试查找类或资源本身之前将对类或资源的搜索委派给其父类加载器。

    支持并发加载类的类加载器称为parallel capable类加载器,需要通过调用ClassLoader.registerAsParallelCapable方法在类初始化时注册自己。 请注意, ClassLoader类默认注册为并行。 但是,如果它们具有并行能力,它的子类仍然需要注册自己。 在委托模型不是严格分层的环境中,类加载器需要是并行的,否则类加载会导致死锁,因为加载器锁在类加载过程的持续时间内保持(参见loadClass方法)。

    Run-time Built-in Class Loaders

    Java运行时具有以下内置类加载器:
    • Bootstrap类加载器。 它是虚拟机的内置类加载器,通常表示为null ,并且没有父级。

    • Platform class loader 平台类加载器可以看到所有平台类 ,它们可以用作ClassLoader实例的父ClassLoader 平台类包括Java SE平台API,它们的实现类以及由平台类加载器或其祖先定义的特定于JDK的运行时类。

      为了允许升级/覆盖定义到平台类加载器的模块,并且升级后的模块读取定义到除平台类加载器及其祖先之外的类加载器的模块,那么平台类加载器可能必须委托给其他类加载器,例如,应用程序类加载器 换句话说,平台类加载器可以看到定义到除平台类加载器及其祖先之外的类加载器的命名模块中的类。

    • System class loader 它也称为应用程序类加载器 ,与平台类加载器不同。 系统类加载器通常用于在应用程序类路径,模块路径和JDK特定工具上定义类。 平台类加载器是系统类加载器的父级或祖先,所有平台类都是可见的。

    通常,Java虚拟机以与平台相关的方式从本地文件系统加载类。 但是,某些类可能不是源自文件; 它们可能来自其他来源,例如网络,或者它们可以由应用程序构建。 方法defineClass将字节数组转换为类的实例。 可以使用Class.newInstance创建此新定义的类的实例。

    由类加载器创建的对象的方法和构造函数可以引用其他类。 要确定所引用的类,Java虚拟机将调用最初创建该类的类加载器的loadClass方法。

    例如,应用程序可以创建网络类加载器以从服务器下载类文件。 示例代码可能如下所示:

       ClassLoader loader = new NetworkClassLoader(host, port);
       Object main = loader.loadClass("Main", true).newInstance();
            . . .
     

    网络类加载器子类必须定义方法findClassloadClassData以从网络加载类。 一旦下载了构成类的字节,它应该使用方法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
                  . . .
             }
         }
     

    Binary names

    提供为任何类名String在参数的方法ClassLoader必须是The Java™ Language Specification定义的二进制名称。

    有效类名的示例包括:

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

    提供为任何包名称String在参数的方法ClassLoader必须是空字符串(表示一个未指定的包),或作为由The Java™ Language Specification定义的完全合格的名称。

    从以下版本开始:
    1.0
    另请参见:
    resolveClass(Class)
    See The Java™ Language Specification:
    6.7完全合格的名称,13.1二进制的形式
    • 构造方法详细信息

      • ClassLoader

        protected ClassLoader​(String name,
                              ClassLoader parent)
        创建具有指定名称的新类加载器,并使用指定的父类加载器进行委派。
        API Note:
        如果父项指定为 null (对于引导类加载器),则无法保证所有平台类都可见。
        参数
        name - 类加载器名称; null如果没有命名
        parent - 父类加载器
        异常
        IllegalArgumentException - 如果给定名称为空。
        SecurityException - 如果存在安全管理器且其 SecurityManager.checkCreateClassLoader()方法不允许创建新的类加载器。
        从以下版本开始:
        9
      • ClassLoader

        protected ClassLoader​(ClassLoader parent)
        使用指定的父类加载器创建新的类加载器以进行委派。

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

        API Note:
        如果父级指定为 null (对于引导类加载器),则无法保证所有平台类都可见。
        参数
        parent - 父类加载器
        异常
        SecurityException - 如果存在安全管理器且其 checkCreateClassLoader方法不允许创建新的类加载器。
        从以下版本开始:
        1.2
      • ClassLoader

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

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

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

      • getName

        public String getName()
        如果未指定此类加载器,则返回此类加载器的名称或 null
        API Note:
        此方法对于兼容性而言是非最终的。 如果重写此方法,则此方法必须返回与实例化此类加载器时指定的名称相同的名称。
        结果
        这个类加载器的名称; null如果此类加载器未命名。
        从以下版本开始:
        9
      • loadClass

        protected <?> loadClass​(String name,
                                     boolean resolve)
                              throws ClassNotFoundException
        使用指定的binary name加载类。 此方法的默认实现按以下顺序搜索类:
        1. 调用findLoadedClass(String)以检查是否已加载该类。

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

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

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

        鼓励ClassLoader子类覆盖findClass(String) ,而不是此方法。

        除非被覆盖,否则此方法在整个类加载过程中同步getClassLoadingLock方法的结果。

        参数
        name - 该类的 binary name
        resolve - 如果 true然后解决该类
        结果
        产生的 对象
        异常
        ClassNotFoundException - 如果找不到该课程
      • getClassLoadingLock

        protected Object getClassLoadingLock​(String className)
        返回类加载操作的锁定对象。 为了向后兼容,此方法的默认实现如下。 如果此ClassLoader对象注册为并行功能,则该方法返回与指定类名关联的专用对象。 否则,该方法返回此ClassLoader对象。
        参数
        className - 要加载的类的名称
        结果
        类加载操作的锁
        异常
        NullPointerException - 如果注册为parallel parallel且 className为null
        从以下版本开始:
        1.7
        另请参见:
        loadClass(String, boolean)
      • findClass

        protected <?> findClass​(String name)
                              throws ClassNotFoundException
        查找具有指定的类binary name 此方法应由遵循委托模型的类加载器实现覆盖以加载类,并且在检查所请求类的父类加载器之后将由loadClass方法调用。
        实现要求:
        默认实现抛出 ClassNotFoundException
        参数
        name - 该 类别的binary name
        结果
        由此产生的 对象
        异常
        ClassNotFoundException - 如果找不到该课程
        从以下版本开始:
        1.2
      • findClass

        protected <?> findClass​(String moduleName,
                                     String name)
        在为此类加载器定义的模块中查找具有给定binary name的类。 支持从模块加载的类加载器实现应该重写此方法。
        API Note:
        如果找不到类,此方法返回 null而不是抛出 ClassNotFoundException
        实现要求:
        moduleNamenull时,默认实现尝试通过调用findClass(String)来查找该类。 否则返回null
        参数
        moduleName - 模块名称; 或者nullunnamed module中为此类加载器查找类
        name - 该 类别中的 binary name
        结果
        得到的 对象,或 null如果类不能被发现。
        从以下版本开始:
        9
      • defineClass

        @Deprecated(since="1.1")
        protected final <?> defineClass​(byte[] b,
                                             int off,
                                             int len)
                                      throws ClassFormatError
        Deprecated.
        将字节数组转换为类的实例。 可以使用之前必须解决它。 不推荐使用此方法,而是使用binary name作为其第一个参数的版本,并且更安全。
        参数
        b - 组成类数据的字节。 位置offoff+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。
        off - 类数据的 b中的起始偏移量
        len - 类数据的长度
        结果
        从指定的类数据创建的 对象
        异常
        ClassFormatError - 如果数据不包含有效类
        IndexOutOfBoundsException - 如果 offlen为负数,或者 off+len大于 b.length
        SecurityException - 如果尝试将此类添加到包含由与此类不同的证书集签名的类的包,或者尝试在包中使用完全限定名称定义类的类以“ java. ”开头。
        另请参见:
        loadClass(String, boolean)resolveClass(Class)
      • defineClass

        protected final <?> defineClass​(String name,
                                             byte[] b,
                                             int off,
                                             int len)
                                      throws ClassFormatError
        将字节数组转换为类的实例。 可以使用之前必须解决它。

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

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

        此方法在此类加载器中定义与的包对应的包(如果此类包尚未在此类加载器中定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b 已定义包的其他属性由软件包指定。

        参数
        name - name的预计 binary name ,或 null若未知
        b - 组成类数据的字节。 位置offoff+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。
        off - 类数据的 b中的起始偏移量
        len - 类数据的长度
        结果
        从指定的类数据创建的 对象。
        异常
        ClassFormatError - 如果数据不包含有效类
        IndexOutOfBoundsException - 如果 offlen为负数,或者 off+len大于 b.length
        SecurityException - 如果尝试将此类添加到包含由除此类(未签名)之外的其他证书集签名的类的包,或者 name以“ java. ”开头。
        从以下版本开始:
        1.1
        另请参见:
        loadClass(String, boolean)resolveClass(Class)CodeSourceSecureClassLoader
      • defineClass

        protected final <?> defineClass​(String name,
                                             byte[] b,
                                             int off,
                                             int len,
                                             ProtectionDomain protectionDomain)
                                      throws ClassFormatError
        将字节数组转换为类的实例,给定ProtectionDomain

        如果给定的ProtectionDomainnull ,则将为该类分配默认保护域,如defineClass(String, byte[], int, int)的文档中所指定。 在可以使用该类之前,必须解决它。

        包中定义的第一个类确定该包中定义的所有后续类必须包含的确切证书集。 一个类的证书集是从该类的ProtectionDomain中的ProtectionDomain获得的。 添加到该程序包的任何类都必须包含相同的证书集, SecurityException将抛出SecurityException 请注意,如果namenull ,则不执行此检查。 您应该始终传入您定义的类的binary name以及字节。 这可以确保您定义的类确实是您认为的类。

        如果指定的name以“ java. ”开头,则只能由platform class loader或其祖先定义; 否则将被抛出SecurityException 如果name不是null ,它必须等于binary name由字节数组指定的类的b ,否则NoClassDefFoundError将被抛出。

        此方法在此类加载器中定义与的包对应的包(如果此类包尚未在此类加载器中定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b 已定义包的其他属性由软件包指定。

        参数
        name - name的预期 binary name ,或 null如果不知道)
        b - 组成类数据的字节。 位置offoff+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。
        off - 类数据的 b中的起始偏移量
        len - 类数据的长度
        protectionDomain - 该 ProtectionDomain
        结果
        从数据创建的 对象和 ProtectionDomain
        异常
        ClassFormatError - 如果数据不包含有效类
        NoClassDefFoundError - 如果 name不是 null且不等于 b指定的类的 b
        IndexOutOfBoundsException - 如果 offlen为负数,或者 off+len大于 b.length
        SecurityException - 如果尝试将此类添加到包含由不同于此类的证书集签名的类的包,或者 name以“ java. ”开头并且此类加载器不是平台类加载器或其类祖先。
      • defineClass

        protected final <?> defineClass​(String name,
                                             ByteBuffer b,
                                             ProtectionDomain protectionDomain)
                                      throws ClassFormatError
        ByteBuffer转换为类的实例,给定ProtectionDomain 如果给定的ProtectionDomainnull ,则将为该类分配默认保护域,如defineClass(String, byte[], int, int)的文档中所指定。 在可以使用该类之前,必须解决它。

        有关在包中定义的第一个类的规则,确定包的证书集,类名的限制以及类的已定义包,与defineClass(String, byte[], int, int, ProtectionDomain)的文档中指定的相同。

        调用此形式的方法cl .defineClass( 名称 , bBuffer , pd )产生与语句完全相同的结果

        ...
        byte[] temp = new byte[bBuffer.remaining()];
        bBuffer.get(temp);
        return cl.defineClass(name, temp, 0, temp.length, pd);

        参数
        name - 预计binary name 该类,或null如果不知道
        b - 组成类数据的字节数。 位置b.position()b.position() + b.limit() -1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。
        protectionDomain - 该 ProtectionDomain ,或 null
        结果
        从数据创建的 对象和 ProtectionDomain
        异常
        ClassFormatError - 如果数据不包含有效类。
        NoClassDefFoundError - 如果 name不是 null且不等于 b指定的类别的 b
        SecurityException - 如果尝试将此类添加到包含由不同于此类的证书集签名的类的包,或者 name以“ java. ”开头。
        从以下版本开始:
        1.5
        另请参见:
        defineClass(String, byte[], int, int, ProtectionDomain)
      • resolveClass

        protected final void resolveClass​(<?> c)
        链接指定的类。 类加载器可以使用这种(误导性命名的)方法来链接类。 如果已经链接了类c ,则此方法仅返回。 否则,按照The Java™ Language Specification的“执行”一章中的描述链接该类
        参数
        c - 要链接的类
        异常
        NullPointerException - 如果 cnull
        另请参见:
        defineClass(String, byte[], int, int)
      • findLoadedClass

        protected final <?> findLoadedClass​(String name)
        返回给定类binary name如果装载机已记录由Java虚拟机作为与一类的初始化加载器binary name 否则返回null
        参数
        name - 该 课程的binary name
        结果
        对象,如果尚未加载类, null
        从以下版本开始:
        1.1
      • setSigners

        protected final void setSigners​(<?> c,
                                        Object[] signers)
        设置类的签名者。 这应该在定义一个类后调用。
        参数
        c - 对象
        signers - 该课程的签名者
        从以下版本开始:
        1.1
      • findResource

        protected URL findResource​(String moduleName,
                                   String name)
                            throws IOException
        返回定义到此类加载器的模块中的资源的URL。 支持从模块加载的类加载器实现应该重写此方法。
        API Note:
        此方法是在基础Class.getResourceClass.getResourceAsStreamModule.getResourceAsStream方法。 它不受Module.getResourceAsStream指定的封装规则的Module.getResourceAsStream
        实现要求:
        moduleNamenull时,默认实现尝试通过调用findResource(String)来查找资源。 否则返回null
        参数
        moduleName - 模块名称; 或者nullunnamed module中为此类加载器查找资源
        name - 资源名称
        结果
        资源的URL; null如果找不到资源,则无法构造URL来定位资源,安全管理器拒绝访问资源,或者没有为类加载器定义给定名称的模块。
        异常
        IOException - 如果发生I / O错误
        从以下版本开始:
        9
        另请参见:
        ModuleReader.find(String)
      • getResource

        public URL getResource​(String name)
        查找具有给定名称的资源。 资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。

        资源的名称是标识资源的“ //路径名。

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源名称以“ .class ”结尾的特殊情况外,此方法仅在无条件地打包opened时才会在命名模块的包中找到资源(即使此方法的调用方位于同一模块中)作为资源)。

        API Note:
        如果将多个模块定义到同一个类加载器,并且多个模块包含具有给定名称的资源,则不会指定搜索模块的顺序,并且可能非常不可预测。 覆盖此方法时,建议实现确保任何委派与getResources(String)方法一致。
        实现要求:
        默认实现将首先在父类加载器中搜索资源; 如果父级是null ,则搜索内置到虚拟机中的类加载器的路径。 如果未找到,此方法将调用findResource(String)来查找资源。
        参数
        name - 资源名称
        结果
        URL读取资源的对象; null如果找不到资源,则无法构造URL以查找资源,资源位于无法无条件打开的程序包中,或者安全管理器拒绝访问该资源。
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        1.1
      • getResources

        public Enumeration<URL> getResources​(String name)
                                      throws IOException
        查找具有给定名称的所有资源。 资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。

        资源的名称是标识资源的/路径名。

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源名称以“ .class ”结尾的特殊情况外,此方法仅在无条件地打包opened时才会在命名模块的包中找到资源(即使此方法的调用方位于同一模块中)作为资源)。

        API Note:
        如果将多个模块定义到同一个类加载器,并且多个模块包含具有给定名称的资源,则不会指定排序,并且可能非常不可预测。 覆盖此方法时,建议实现确保任何委派与getResource(String)方法一致。 这应该确保Enumeration的nextElement方法返回的第一个元素与getResource(String)方法返回的资源相同。
        实现要求:
        默认实现将首先在父类加载器中搜索资源; 如果父级是null ,则搜索内置到虚拟机中的类加载器的路径。 然后调用findResources(String)以在此类加载器中查找具有名称的资源。 它返回一个枚举,其元素是通过搜索父类加载器后跟找到的findResources找到的元素找到的findResources
        参数
        name - 资源名称
        结果
        枚举URL资源的对象。 如果找不到资源,则枚举将为空。 无法构造URL资源位于无法无条件打开的程序包中,或者安全管理器拒绝对资源的访问,不会在枚举中返回。
        异常
        IOException - 如果发生I / O错误
        NullPointerException - 如果 namenull
        从以下版本开始:
        1.2
      • resources

        public Stream<URL> resources​(String name)
        返回一个流,其元素是具有给定名称的所有资源的URL。 资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。

        资源的名称是标识资源的/路径名。

        在评估返回的流时将找到资源。 如果评估结果为IOException则I / O异常将包含在UncheckedIOException ,然后抛出该异常。

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源的名称以“ .class ”结尾的特殊情况之外,此方法仅在无条件地打包opened时才会在命名模块的包中找到资源(即使此方法的调用方位于同一模块中)作为资源)。

        API Note:
        覆盖此方法时,建议实现确保任何委派与getResource(String)方法一致。 这应确保流返回的第一个元素与getResource(String)方法返回的资源相同。
        实现要求:
        默认实现调用 getResources以查找具有给定名称的所有资源,并返回包含枚举中的元素作为源的流。
        参数
        name - 资源名称
        结果
        资源流URL对象。 如果找不到资源,则流将为空。 无法构造URL资源位于无法无条件打开的程序包中,或者安全管理器拒绝对资源的访问,不会在流中。
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        9
      • findResource

        protected URL findResource​(String name)
        查找具有给定名称的资源。 类加载器实现应该重写此方法。

        对于命名模块中的资源,该方法必须实现模块 getResourceAsStream方法中指定的封装规则。 此外,它必须在命名模块的包中找不到非“ .class ”资源,除非包无条件地为opened

        实现要求:
        默认实现返回 null
        参数
        name - 资源名称
        结果
        URL读取资源的对象; null如果找不到资源,则无法构造URL以查找资源,资源位于无法无条件打开的程序包中,或者安全管理器拒绝访问该资源。
        从以下版本开始:
        1.2
      • findResources

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

        对于命名模块中的资源,该方法必须实现模块 getResourceAsStream方法中指定的封装规则。 此外,它必须在命名模块的包中找不到非“ .class ”资源,除非包无条件地为opened

        实现要求:
        默认实现返回不包含元素的枚举。
        参数
        name - 资源名称
        结果
        资源的URL对象的枚举。 如果找不到资源,则枚举将为空。 无法构造URL资源位于无法无条件打开的程序包中,或者安全管理器拒绝对资源的访问,不会在枚举中返回。
        异常
        IOException - 如果发生I / O错误
        从以下版本开始:
        1.2
      • registerAsParallelCapable

        protected static boolean registerAsParallelCapable()
        将呼叫者注册为parallel capable 当且仅当满足以下所有条件时,注册才会成功:
        1. 没有创建调用者的实例
        2. 调用者的所有超类(除了类Object)都被注册为并行能力

        请注意,一旦类加载器注册为并行功能,就无法将其更改回来。

        结果
        true如果呼叫者已成功注册为并行能力, false否则为 false
        从以下版本开始:
        1.7
        另请参见:
        isRegisteredAsParallelCapable()
      • isRegisteredAsParallelCapable

        public final boolean isRegisteredAsParallelCapable()
        返回 true如果这个类加载器被注册为 parallel capable ,否则 false
        结果
        true如果此类加载器是并行的,否则为 false
        从以下版本开始:
        9
        另请参见:
        registerAsParallelCapable()
      • getSystemResource

        public static URL getSystemResource​(String name)
        从用于加载类的搜索路径中查找指定名称的资源。 此方法通过系统类加载器查找资源(请参阅getSystemClassLoader() )。

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源的名称以“ .class ”结尾的特殊情况之外,此方法仅在无条件地打包opened时才能在命名模块的包中找到资源。

        参数
        name - 资源名称
        结果
        资源URL ; null如果找不到资源,则无法构造URL来定位资源,资源位于无法无条件打开的包中,或者安全管理器拒绝访问资源。
        从以下版本开始:
        1.1
      • getSystemResources

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

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

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源名称以“ .class ”结尾的特殊情况之外,此方法仅在无条件地打包opened时才能在命名模块的包中找到资源。

        参数
        name - 资源名称
        结果
        枚举URL资源的对象。 如果找不到资源,则枚举将为空。 无法构造URL资源位于无法无条件打开的程序包中,或者安全管理器拒绝对资源的访问,不会在枚举中返回。
        异常
        IOException - 如果发生I / O错误
        从以下版本开始:
        1.2
      • getResourceAsStream

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

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

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源的名称以“ .class ”结尾的特殊情况之外,此方法仅在无条件地打包opened时才能在命名模块的包中找到资源。

        参数
        name - 资源名称
        结果
        用于读取资源的输入流; null如果找不到资源,则资源位于无法无条件打开的程序包中,或者安全管理器拒绝对资源的访问。
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        1.1
      • getSystemResourceAsStream

        public static InputStream getSystemResourceAsStream​(String name)
        打开以便从用于加载类的搜索路径中读取指定名称的资源。 此方法通过系统类加载器查找资源(请参阅getSystemClassLoader() )。

        命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束 此外,除了资源的名称以“ .class ”结尾的特殊情况之外,此方法仅在无条件地打包opened时才能在命名模块的包中找到资源。

        参数
        name - 资源名称
        结果
        用于读取资源的输入流; null如果找不到资源,则资源位于无法无条件打开的程序包中,或者安全管理器拒绝访问该资源。
        从以下版本开始:
        1.1
      • getParent

        public final ClassLoader getParent()
        返回委托的父类加载器。 某些实现可能使用null来表示引导类加载器。 如果此类加载器的父级是引导类加载器,则此方法将在此类实现中返回null
        结果
        父母 ClassLoader
        异常
        SecurityException - 如果存在安全管理器,并且调用者的类加载器不是null并且不是此类加载器的祖先,并且调用者没有RuntimePermission ("getClassLoader")
        从以下版本开始:
        1.2
      • getUnnamedModule

        public final 模块 getUnnamedModule()
        返回此类加载器的未命名 模块
        结果
        这个类加载器的未命名模块
        从以下版本开始:
        9
        另请参见:
        Module.isNamed()
      • getPlatformClassLoader

        public static ClassLoader getPlatformClassLoader()
        返回平台类加载器。 所有platform classes对平台类加载器可见。
        Implementation Note:
        内置平台类加载器的名称是 "platform"
        结果
        平台 ClassLoader
        异常
        SecurityException - 如果存在安全管理器,并且调用者的类加载器不是null ,并且调用者的类加载器与平台类加载器的不同或者是祖先,并且调用者没有RuntimePermission ("getClassLoader")
        从以下版本开始:
        9
      • getSystemClassLoader

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

        首先在运行时的启动序列中调用此方法,此时它将创建系统类加载器。 此类加载器将是主应用程序线程的上下文类加载器(例如,调用主类的main方法的线程)。

        默认的系统类加载器是此类的依赖于实现的实例。

        如果在首次调用此方法时定义了系统属性“ java.system.class.loader ”,那么该属性的值将被视为将作为系统类加载器返回的类的名称。 使用默认的系统类加载器加载该类,并且必须定义一个公共构造函数,该构造函数接受一个类型为ClassLoader参数,该参数用作委托父级。 然后使用此构造函数创建一个实例,并使用默认的系统类加载器作为参数。 生成的类加载器被定义为系统类加载器。 在构造过程中,类加载器应该非常小心,以避免调用getSystemClassLoader() 如果检测到系统类加载器的循环初始化,则抛出IllegalStateException

        Implementation Note:
        在VM几乎完全初始化之前,不会检查覆盖系统类加载器的系统属性。 在启动期间执行此方法的代码应注意不要在系统完全初始化之前缓存返回值。

        内置系统类加载器的名称是"app" 在VM的早期初始化期间读取系统属性“ java.class.path ”以确定类路径。 根据初始模块(包含主类的模块)是命名还是未命名,“ java.class.path ”属性的空值被不同地解释:如果命名,则内置系统类加载器将没有类路径并将搜索类和使用应用程序模块路径的资源; 否则,如果未命名,则会将类路径设置为当前工作目录。

        结果
        系统 ClassLoader
        异常
        SecurityException - 如果存在安全管理器,并且调用者的类加载器不是null且与系统类加载器的祖先不同,并且调用者没有RuntimePermission ("getClassLoader")
        IllegalStateException - 如果在构造由“ java.system.class.loader ”属性指定的类加载器期间递归调用。
        Error - 如果定义了系统属性“ java.system.class.loader ”但无法加载指定的类,则提供程序类不会定义所需的构造函数,或者在调用该构造函数时会抛出异常。 可以通过Throwable.getCause()方法检索错误的根本原因。
      • definePackage

        protected 软件包 definePackage​(String name,
                                        String specTitle,
                                        String specVersion,
                                        String specVendor,
                                        String implTitle,
                                        String implVersion,
                                        String implVendor,
                                        URL sealBase)
        ClassLoader中定义一个包ClassLoader

        Package names在类加载器中必须是唯一的,并且一旦创建就无法重新定义或更改。

        如果类加载器希望定义具有特定属性的包(例如版本信息),则类加载器应在调用defineClass之前调用此definePackage方法。 否则, defineClass方法将在此类加载器中定义一个与新定义的类的包对应的包; 此定义的包的属性由软件包指定。

        API Note:
        希望为JAR中的类定义包的类加载器通常使用JAR清单中的规范和实现标题,版本和供应商。 如果包被指定为sealed JAR的清单,该URL的JAR文件通常用作sealBase 如果此类加载器定义的包'p'的类是从多个JAR加载的,则软件包对象可能包含不同的信息,具体取决于定义的第一类包'p'以及首先读取哪个JAR清单以显式定义包'p'

        强烈建议类加载器不要调用此方法来明确定义命名模块中的包; 相反,当类为being defined时,将自动定义包。 如果需要显式定义软件包 ,则应确保使用软件包指定的属性定义命名模块中的所有包。 否则,命名模块中的一些软件包对象可以例如用不同的密封基座密封。

        参数
        name - package name
        specTitle - 规范标题
        specVersion - 规范版本
        specVendor - 规范供应商
        implTitle - 实现标题
        implVersion - 实施版本
        implVendor - 实施供应商
        sealBase - 如果不是null ,则此包相对于给定的代码源URL对象是密封的。 否则,包装没有密封。
        结果
        新定义的 软件包对象
        异常
        NullPointerException - 如果 namenull
        IllegalArgumentException - 如果此类加载器已定义给定 name的包
        从以下版本开始:
        1.2
        另请参见:
        The JAR File Specification: Package Sealing
        See The Java™ Virtual Machine Specification:
        5.3运行时包
      • getDefinedPackage

        public final 软件包 getDefinedPackage​(String name)
        返回 软件包给定的 name已经被这个类加载器定义。
        参数
        name - package name
        结果
        软件包给定的名字已被这个类加载器定义,或 null如果未找到
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        9
        See The Java™ Virtual Machine Specification:
        5.3运行时包
      • getDefinedPackages

        public final 软件包[] getDefinedPackages()
        返回此类加载器定义的所有软件包 返回的数组没有重复的软件包同名。
        API Note:
        此方法返回一个数组而不是 SetStream ,以与现有的 getPackages()方法保持一致。
        结果
        由此类加载器定义的软件包对象数组; 如果此类加载器未定义包,则为零长度数组。
        从以下版本开始:
        9
        See The Java™ Virtual Machine Specification:
        5.3运行时包
      • getPackage

        @Deprecated(since="9")
        protected 软件包 getPackage​(String name)
        Deprecated.
        If multiple class loaders delegate to each other and define classes with the same package name, and one such loader relies on the lookup behavior of getPackage to return a 软件包 from a parent loader, then the properties exposed by the 软件包 may not be as expected in the rest of the program. For example, the 软件包 will only expose annotations from the package-info.class file defined by the parent loader, even if annotations exist in a package-info.class file defined by a child loader. A more robust approach is to use the getDefinedPackage(java.lang.String) method which returns a 软件包 for the specified class loader.
        在此类加载器及其祖先中找到name的软件包。

        如果这个类装载器定义软件包给定的名称,该软件包返回。 否则, 软件包递归方式(父级父级)搜索此类加载器的祖先,以软件包给定名称的软件包

        API Note:
        platform class loader可以委托给应用程序类加载器,但应用程序类加载器不是它的祖先。 在平台类加载器上调用时,此方法将找不到为应用程序类加载器定义的包。
        参数
        name - package name
        结果
        软件包已经被这个类加载器或其祖先,或定义的给定名称 null如果没有找到。
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        1.2
        另请参见:
        getDefinedPackage(String)
      • getPackages

        protected 软件包[] getPackages()
        返回此类加载器及其祖先定义的所有软件包 返回的阵列可以包含多个软件包同一包名称的对象,每一个由在类装载器层次不同的类加载器定义。
        API Note:
        platform class loader可以委托给应用程序类加载器。 换句话说,定义到应用程序类加载器的模块中的包对于平台类加载器是可见的。 另一方面,应用程序类加载器不是它的祖先,因此当在平台类加载器上调用时,此方法不会返回定义到应用程序类加载器的任何包。
        结果
        由此类加载器及其祖先定义的 软件包对象的数组
        从以下版本开始:
        1.2
        另请参见:
        getDefinedPackages()
      • findLibrary

        protected String findLibrary​(String libname)
        返回本机库的绝对路径名。 VM调用此方法来查找属于使用此类加载器加载的类的本机库。 如果此方法返回null ,则VM将沿指定为“ 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.utiljava.lang.reflect是子包java

        如果多个包默认值适用于给定的类,则与特定包最相关的包默认优先于其他包。 例如,如果javax.langjavax.lang.reflect都具有与之关联的包默认值,则后一个包默认应用于javax.lang.reflect类。

        包默认值优先于类加载器的默认断言状态,并且可以通过调用setClassAssertionStatus(String, boolean)在每个类的基础上重写

        参数
        packageName - 要设置其包默认断言状态的包的名称。 null值表示未命名的包为“当前”(请参阅The Java™ Language Specification的第7.4.2节)。
        enabled - true如果此类加载器加载的类属于命名包或其任何子包,则默认情况下将启用断言, false如果它们默认情况下将禁用断言。
        从以下版本开始:
        1.4
      • setClassAssertionStatus

        public void setClassAssertionStatus​(String className,
                                            boolean enabled)
        为此类加载器中指定的顶级类及其中包含的任何嵌套类设置所需的断言状态。 此设置优先于类加载器的默认断言状态,并优先于任何适用的每个包默认值。 如果已经初始化了命名类,则此方法无效。 (初始化一个类后,其断言状态不会改变。)

        如果指定的类不是顶级类,则此调用将不会影响任何类的实际断言状态。

        参数
        className - 要设置其断言状态的顶级类的完全限定类名。
        enabled - true如果命名类要在初始化时(和如果)初始化时启用断言,则 false如果要禁用断言, false
        从以下版本开始:
        1.4
      • clearAssertionStatus

        public void clearAssertionStatus()
        将此类加载器的默认断言状态设置为false并丢弃与类加载器关联的任何包默认值或类断言状态设置。 提供此方法是为了使类加载器可以忽略任何命令行或持久断言状态设置并“从一个干净的平板开始”。
        从以下版本开始:
        1.4