Module  java.base
软件包  java.lang

Class ClassLoader

  • 已知直接子类:
    SecureClassLoader


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

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

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

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

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

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

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

    支持并发加载类的类加载器称为parallel capable类加载器,并且需要通过调用ClassLoader.registerAsParallelCapable方法在其类初始化时注册自身。 请注意,默认情况下, ClassLoader类注册为并行。 然而,它的子类仍然需要注册自己,如果它们是并行的能力。 在委托模式不是严格层次化的环境中,类装载器需要并行才能,否则加载类可能导致死锁,因为加载程序锁定在类加载过程中保持(见loadClass方法)。

    Run-time Built-in Class Loaders

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

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

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

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

    通常,Java虚拟机以平台相关的方式从本地文件系统加载类。 然而,一些类可能不是源于文件; 它们可以来自诸如网络的其他来源,或者它们可以由应用构建。 方法defineClass将字节数组转换为类别Class的实例。 这个新定义的类的实例可以使用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
      • getClassLoadingLock

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

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

        protected Class<?> findClass​(String moduleName,
                                     String name)
        在定义到此类加载器的模块中找到给定的类别binary name 支持从模块加载的类加载器实现应该覆盖此方法。
        API Note:
        该方法返回 null而不是抛出 ClassNotFoundException如果该类无法找到。
        实现要求:
        moduleNamenull时,默认实现会通过调用findClass(String)来查找该类。 否则返回null
        参数
        moduleName - 模块名称; null找到这个类加载器的unnamed module中的类
        name - 该类的 binary name
        结果
        由此产生的 Class对象,或 null如果该类无法找到。
        从以下版本开始:
        9
      • defineClass

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

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

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

        要指定一个特定的ProtectionDomain到类,使用defineClass方法,它接受ProtectionDomain作为它的一个参数。

        这个方法定义了一个在这个类加载器中的包对应于Class的包(如果这样的包在这个类加载器中还没有被定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b 定义包的其他属性由软件包指定。

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

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

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

        包中定义的第一个类决定了该包中定义的所有后续类必须包含的确切的证书集。 一组课程的证书是从课程ProtectionDomain中的ProtectionDomain获得的。 添加到该包中的任何类必须包含相同的证书集,或者抛出一个SecurityException 请注意,如果namenull ,则不执行此检查。 你应该总是传递你所定义的类的binary name以及字节。 这确保你所定义的类确实是你认为的类。

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

        这个方法定义了一个在这个类加载器中的一个包,该包与Class的包(如果这样一个包在这个类加载器中还没有定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b 定义包的其他属性由软件包指定。

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

        protected final Class<?> defineClass​(String name,
                                             ByteBuffer b,
                                             ProtectionDomain protectionDomain)
                                      throws ClassFormatError
        一个转换ByteBuffer成类的实例Class ,与给定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
        结果
        从数据创建的 Class对象,和 ProtectionDomain
        异常
        ClassFormatError - 如果数据不包含有效的类。
        NoClassDefFoundError - 如果 name不是 null而不等于 b指定的类别的 b
        SecurityException - 如果尝试将此类添加到包含由该类别的不同证书签名的类的包中,或者如果 name以“ java. ”开头。
        从以下版本开始:
        1.5
        另请参见:
        defineClass(String, byte[], int, int, ProtectionDomain)
      • resolveClass

        protected final void resolveClass​(Class<?> c)
        链接指定的类。 这个(误导性的)方法可能被类加载器用来链接一个类。 如果c类已经被链接,那么这个方法只是返回。 否则,课程将按照The Java™ Language Specification的“执行”一章中所述进行链接
        参数
        c - 要链接的课程
        异常
        NullPointerException - 如果 cnull
        另请参见:
        defineClass(String, byte[], int, int)
      • findLoadedClass

        protected final Class<?> findLoadedClass​(String name)
        如果这个装载程序已被Java虚拟机记录为具有该类别的启动加载程序,则返回具有给定的binary name的类binary name 否则返回null
        参数
        name - 该类的 binary name
        结果
        Class对象,或 null如果该类尚未加载
        从以下版本开始:
        1.1
      • setSigners

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

        protected URL findResource​(String moduleName,
                                   String name)
                            throws IOException
        返回一个URL定义到此类加载器的模块中的资源。 支持从模块加载的类加载器实现应该覆盖此方法。
        API Note:
        此方法是在基础Class.getResourceClass.getResourceAsStream ,并Module.getResourceAsStream方法。 它不受Module.getResourceAsStream规定的封装规则的Module.getResourceAsStream
        实现要求:
        moduleNamenull时,默认实现会通过调用findResource(String)来查找资源。 否则返回null
        参数
        moduleName - 模块名称; null找到在资源unnamed 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)方法一致。 这应该确保枚举的nextElement方法返回的第一个元素是与getResource(String)方法返回的资源相同的。
        实现要求:
        默认实现将首先搜索父类加载器的资源; 如果父级是null ,则搜索内置到虚拟机中的类加载器的路径。 然后,它调用findResources(String)在该类加载器中找到具有名称的资源。 它返回一个枚举,其元素是通过搜索父类加载器找到的URL,后跟使用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)
        找到具有给定名称的资源。 类加载器实现应该覆盖此方法。

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

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

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

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

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

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

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

        结果
        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 - 资源名称
        结果
        A资源的一个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 Module getUnnamedModule​()
        返回此类加载器的未命名的 Module
        结果
        这个类加载器的未命名模块
        从以下版本开始:
        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() 如果检测到系统类加载器的循环初始化,则抛出未指定的错误或异常。

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

        内置系统类加载器的名称为"app" 内置系统类加载器使用的类路径由VM初始化期间的系统属性“ 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)
        通过定义一个包name在这个ClassLoader

        Package names在类加载器中必须是唯一的,创建后不能重新定义或更改。

        如果一个类加载器希望定义具有特殊性能,如版本信息的包,那么类装载器应该调用此definePackage之前调用方法defineClass 否则, 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
      • getDefinedPackage

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

        public final 软件包[] getDefinedPackages​()
        返回此类加载器定义的所有软件包 s。 返回的数组没有重复的软件包
        API Note:
        该方法返回数组而不是 SetStream ,以与现有的 getPackages()方法保持一致。
        结果
        由该类加载器定义的软件包对象的数组; 或者如果没有由此类加载器定义包,则为零长度数组。
        从以下版本开始:
        9
      • getPackage

        @Deprecated(since="9")
        protected 软件包 getPackage​(String name)
        已过时。 如果多个类加载器彼此委托并定义具有相同包名称的类,并且一个这样的加载器依赖于getPackage的查找行为从父加载器返回一个软件包 ,则由软件包公开的属性可能不如预期的那样其余的程序。 例如, 软件包将仅显示由父加载程序定义的package-info.class文件中的注释,即使子载入程序定义的package-info.class文件中存在注释。 更健壮的方法是使用getDefinedPackage(java.lang.String)方法,该方法为指定的类加载器返回一个软件包
        在这个类加载器及其祖先中找到一个由name提供的包。

        如果这个类装载器定义软件包给定的名称,该软件包返回。 否则,对于给定名称的软件包 ,这个类加载器的祖先被递归地搜索(父代父代)。

        API Note:
        platform class loader可以委托给应用程序类加载器,但应用程序类加载器不是其祖先。 当在平台类加载器上调用时,此方法将找不到定义到应用程序类加载器的包。
        参数
        name - package name
        结果
        软件包对应于由此类加载器或其祖先定义的给定名称,如果未找到, null
        异常
        NullPointerException - 如果 namenull
        从以下版本开始:
        1.2
      • getPackages

        protected 软件包[] getPackages​()
        返回此类加载器及其祖先定义的所有软件包 返回的阵列可以包含多个软件包同一包名称的对象,每一个由在类装载器层次不同的类加载器定义。
        API Note:
        platform class loader可以委托给应用程序类加载器。 换句话说,定义到应用程序类加载器的模块中的包可能对平台类加载器是可见的。 另一方面,应用程序类加载器不是其祖先,因此在平台类加载器上调用时,此方法将不会返回定义到应用程序类加载器的任何包。
        结果
        由此类加载器及其祖先定义的 软件包对象的数组
        从以下版本开始:
        1.2
      • 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 - 要设置其包默认断言状态的包的名称。 A null值表示未命名的包为“current”(参见The 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