- java.lang.Object
-
- java.lang.ClassLoader
-
- 已知直接子类:
-
SecureClassLoader
public abstract class ClassLoader extends Object
类加载器是负责加载类的对象。ClassLoader是一个抽象类。 给定一个类的binary name ,类加载器应该尝试定位或生成构成类的定义的数据。 典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个
Class对象包含一个reference的ClassLoader定义它。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(); . . .网络类加载器子类必须定义方法
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 . . . } }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二进制形式
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protectedClassLoader()创建使用一个新的类加载器ClassLoader该方法返回getSystemClassLoader()作为父类加载器。protectedClassLoader(ClassLoader parent)使用指定的父类加载器创建一个新的类加载器进行委派。protectedClassLoader(String name, ClassLoader parent)创建指定名称的新类加载器,并使用指定的父类加载器进行委派。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 弃用的方法 Modifier and Type 方法 描述 voidclearAssertionStatus()将此类加载器的默认断言状态设置为false并丢弃与类加载器相关联的任何包默认值或类断言状态设置。protected Class<?>defineClass(byte[] b, int off, int len)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)将字节数组转换为类别Class的实例,并给出ProtectionDomain。protected Class<?>defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain)一个转换ByteBuffer成类的实例Class,与给定ProtectionDomain。protected 软件包definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase)在这个ClassLoader定义了一个 name的包。protected Class<?>findClass(String name)查找具有指定的 类别binary name 。protected Class<?>findClass(String moduleName, String name)在定义到此类加载器的模块中找到给定的类别 binary name 。protected StringfindLibrary(String libname)返回本机库的绝对路径名。protected Class<?>findLoadedClass(String name)如果这个装载程序已被Java虚拟机记录为具有该类别的启动加载程序,则返回具有给定的 binary name的类 binary name 。protected URLfindResource(String name)找到具有给定名称的资源。protected URLfindResource(String moduleName, String name)返回一个URL定义到此类加载器的模块中的资源。protected Enumeration<URL>findResources(String name)返回表示具有给定名称的所有资源的URL对象的枚举。protected Class<?>findSystemClass(String name)查找具有指定的 类别binary name ,如有必要,加载它。protected ObjectgetClassLoadingLock(String className)返回类加载操作的锁定对象。软件包getDefinedPackage(String name)返回软件包给定的 name已经被这个类加载器定义。软件包[]getDefinedPackages()返回此类加载器定义的所有软件包s。StringgetName()如果此类加载器未命名,则返回此类加载器的名称或null。protected 软件包getPackage(String name)已过时。如果多个类加载器彼此委托并定义具有相同包名称的类,并且一个这样的加载器依赖于getPackage的查找行为从父加载器返回一个软件包,那么由软件包公开的属性可能不如预期的那样其余的程序。 例如,软件包将仅显示由父加载程序定义的package-info.class文件中的注释,即使注释存在于由子加载器定义的package-info.class文件中。 更健壮的方法是使用getDefinedPackage(java.lang.String)方法,该方法为指定的类加载器返回一个软件包。protected 软件包[]getPackages()返回此类加载器及其祖先定义的所有软件包。ClassLoadergetParent()返回父类加载器进行委派。static ClassLoadergetPlatformClassLoader()返回用于委派的平台类加载器。URLgetResource(String name)找到具有给定名称的资源。InputStreamgetResourceAsStream(String name)返回用于读取指定资源的输入流。Enumeration<URL>getResources(String name)查找具有给定名称的所有资源。static ClassLoadergetSystemClassLoader()返回用于委派的系统类加载器。static URLgetSystemResource(String name)从用于加载类的搜索路径中查找指定名称的资源。static InputStreamgetSystemResourceAsStream(String name)打开阅读,从用于加载类的搜索路径中指定名称的资源。static Enumeration<URL>getSystemResources(String name)从用于加载类的搜索路径中查找指定名称的所有资源。ModulegetUnnamedModule()返回此类加载器的未命名的Module。booleanisRegisteredAsParallelCapable()Class<?>loadClass(String name)加载指定的 类别binary name 。protected Class<?>loadClass(String name, boolean resolve)加载指定的 类别binary name 。protected static booleanregisterAsParallelCapable()注册呼叫者为 parallel capable 。protected voidresolveClass(Class<?> c)链接指定的类。Stream<URL>resources(String name)返回一个流,其元素是具有给定名称的所有资源的URL。voidsetClassAssertionStatus(String className, boolean enabled)为此类加载器中指定的顶级类和其中包含的任何嵌套类设置所需的断言状态。voidsetDefaultAssertionStatus(boolean enabled)设置此类加载器的默认断言状态。voidsetPackageAssertionStatus(String packageName, boolean enabled)设置命名包的包默认断言状态。protected voidsetSigners(Class<?> c, Object[] signers)设置一个类的签名者。
-
-
-
构造方法详细信息
-
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
public Class<?> loadClass(String name) throws ClassNotFoundException
加载指定的类别binary name 。 该方法以与loadClass(String, boolean)方法相同的方式搜索类。 它由Java虚拟机调用来解析类引用。 调用此方法相当于调用loadClass(name, false)。- 参数
-
name- 该类的 binary name - 结果
-
由此产生的
Class对象 - 异常
-
ClassNotFoundException- 如果没有找到该类
-
loadClass
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
加载指定的类别binary name 。 此方法的默认实现按以下顺序搜索类:调用
findLoadedClass(String)以检查类是否已经加载。在父类加载器上调用
loadClass方法。 如果父级是null,则使用内置到虚拟机中的类加载器。调用
findClass(String)方法来查找类。
如果使用上述步骤找到该类,并且
resolve标志为真,则该方法将调用resolveClass(Class)方法对所生成的Class对象。鼓励
ClassLoader子类覆盖findClass(String),而不是这种方法。除非被覆盖,否则该方法在整个类加载过程中同步
getClassLoadingLock方法的结果。- 参数
-
name- 该类的 binary name -
resolve- 如果true然后解析该类 - 结果
-
由此产生的
Class对象 - 异常
-
ClassNotFoundException- 如果找不到该类
-
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如果该类无法找到。 - 实现要求:
-
当
moduleName是null时,默认实现会通过调用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
- 参数
-
b- 构成类数据的字节。 位置off至off+len-1的字节应具有由The Java™ Virtual Machine Specification定义的有效类文件的格式。 -
off- 类数据中的起始偏移量为b -
len- 类数据的长度 - 结果
-
从指定的类数据创建的
Class对象 - 异常
-
ClassFormatError- 如果数据不包含有效的类 -
IndexOutOfBoundsException- 如果off或len为负数,或者如果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- 构成类数据的字节。 位置off至off+len-1的字节应具有由The 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, ProtectionDomain protectionDomain) throws ClassFormatError
将字节数组转换为类别Class的实例,并给出ProtectionDomain。如果给定的
ProtectionDomain是null,则默认保护域将分配给defineClass(String, byte[], int, int)的文档中指定的类。 在课堂可以使用之前,必须解决。包中定义的第一个类决定了该包中定义的所有后续类必须包含的确切的证书集。 一组课程的证书是从课程ProtectionDomain中的
ProtectionDomain获得的。 添加到该包中的任何类必须包含相同的证书集,或者抛出一个SecurityException。 请注意,如果name为null,则不执行此检查。 你应该总是传递你所定义的类的binary name以及字节。 这确保你所定义的类确实是你认为的类。如果指定的
name以“java.”开头,则只能由platform class loader或其祖先定义; 否则将抛出SecurityException。 如果name不是null,它必须等于binary name由字节数组指定的类的b,否则NoClassDefFoundError将被抛出。这个方法定义了一个在这个类加载器中的一个包,该包与
Class的包(如果这样一个包在这个类加载器中还没有定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b。 定义包的其他属性由软件包指定。- 参数
-
name- 预期的 binary name的类,或null如果不知道 -
b- 构成类数据的字节。 位置off至off+len-1的字节应具有由The Java™ Virtual Machine Specification定义的有效类文件的格式。 -
off- 类数据中的起始偏移量为b -
len- 类数据的长度 -
protectionDomain- 该类的ProtectionDomain - 结果
-
从数据创建的
Class对象,和ProtectionDomain。 - 异常
-
ClassFormatError- 如果数据不包含有效的类 -
NoClassDefFoundError- 如果name不是null而不等于 b指定的类别的b -
IndexOutOfBoundsException- 如果off或len为负数,或者如果off+len大于b.length。 -
SecurityException- 如果尝试将此类添加到包含由不同于该类的不同证书集签名的包的包中,或者如果name以“java.”开头,并且此类加载器不是平台类加载器或其祖先。
-
defineClass
protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
一个转换ByteBuffer成类的实例Class,与给定ProtectionDomain。 如果给定的ProtectionDomain是null,则默认保护域将被分配给defineClass(String, byte[], int, int)的文档中指定的类。 在课堂可以使用之前,必须解决。关于包中定义的第一个类的规则,确定包的证书集,类名的限制和类的定义包与
defineClass(String, byte[], int, int, ProtectionDomain)的文档中指定的相同。调用此方法的形式为cl
.defineClass(名称,bBuffer,pd)产生与语句完全相同的结果...
byte[] temp = new byte[bBuffer.remaining()];
bBuffer.get(temp);
returncl.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- 如果c是null。 - 另请参见:
-
defineClass(String, byte[], int, int)
-
findSystemClass
protected final Class<?> findSystemClass(String name) throws ClassNotFoundException
找到一个指定的类别binary name ,如果需要加载。此方法通过系统类加载器加载类(请参阅
getSystemClassLoader())。 返回的Class对象可能有多个ClassLoader关联。ClassLoader子类通常不需要调用此方法,因为大多数类加载器只需要覆盖findClass(String)。- 参数
-
name- 该类的 binary name - 结果
-
Class对象为指定的name - 异常
-
ClassNotFoundException- 如果找不到该类 - 另请参见:
-
ClassLoader(ClassLoader),getParent()
-
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.getResource,Class.getResourceAsStream,并Module.getResourceAsStream方法。 它不受Module.getResourceAsStream规定的封装规则的Module.getResourceAsStream。 - 实现要求:
-
当
moduleName为null时,默认实现会通过调用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- 如果name是null - 从以下版本开始:
- 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- 如果name是null - 从以下版本开始:
- 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- 如果name是null - 从以下版本开始:
- 9
-
findResource
protected URL findResource(String name)
找到具有给定名称的资源。 类加载器实现应该覆盖此方法。对于命名模块中的资源,该方法必须实现
ModulegetResourceAsStream方法中指定的封装规则。 另外,它不能在命名模块的包中找到非“.class”资源,除非该包是无条件的opened。- 实现要求:
-
默认实现返回
null。 - 参数
-
name- 资源名称 - 结果
-
URL读取资源的对象;null如果无法找到资源,则无法构建一个URL来定位资源,该资源在一个未被无条件打开的包中,或该资源的访问被安全管理器拒绝。 - 从以下版本开始:
- 1.2
-
findResources
protected Enumeration<URL> findResources(String name) throws IOException
返回表示具有给定名称的所有资源的URL对象的枚举。 类加载器实现应该覆盖此方法。对于命名模块中的资源,该方法必须实现
ModulegetResourceAsStream方法中指定的封装规则。 另外,它不能在命名模块的包中找到非“.class”资源,除非该软件包是无条件的opened。- 实现要求:
- 默认实现返回一个不包含元素的枚举。
- 参数
-
name- 资源名称 - 结果
-
枚举该资源的
URL个对象。 如果找不到资源,枚举将为空。 无法构建URL资源在不能无条件打开的包中,或安全管理员拒绝对资源的访问,不会在枚举中返回。 - 异常
-
IOException- 如果发生I / O错误 - 从以下版本开始:
- 1.2
-
registerAsParallelCapable
protected static boolean registerAsParallelCapable()
注册呼叫者为parallel capable 。 当且仅当满足以下所有条件时,注册才能成功:- 没有创建调用者的实例
- 调用者的所有超类(除对象类)都被注册为并行的
请注意,一旦类加载器被注册为并行功能,则无法将其更改。
- 结果
-
true如果呼叫者成功注册为并行功能,false否则为false。 - 从以下版本开始:
- 1.7
- 另请参见:
-
isRegisteredAsParallelCapable()
-
isRegisteredAsParallelCapable
public final boolean isRegisteredAsParallelCapable()
- 结果
-
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- 如果name是null - 从以下版本开始:
- 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- 如果name是null。 -
IllegalArgumentException- 如果给定的name的包已经由此类加载器定义 - 从以下版本开始:
- 1.2
- 另请参见:
- The JAR File Specification: Package Sealing
-
getDefinedPackage
public final 软件包 getDefinedPackage(String name)
返回软件包给定的 name已经被这个类加载器定义。- 参数
-
name- package name - 结果
-
该
软件包给定名字的这个类加载器定义,或者null;如果未找到 - 异常
-
NullPointerException- 如果name是null。 - 从以下版本开始:
- 9
-
getDefinedPackages
public final 软件包[] getDefinedPackages()
返回此类加载器定义的所有软件包s。 返回的数组没有重复的软件包。- API Note:
-
该方法返回数组而不是
Set或Stream,以与现有的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- 如果name是null。 - 从以下版本开始:
- 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.util和java.lang.reflect是子包java。如果多个包默认值适用于给定的类,则与最特定包相关的包默认优先于其他包。 例如,如果
javax.lang和javax.lang.reflect都具有与它们相关联的包默认值,则后者的包默认值适用于javax.lang.reflect类。软件包默认值优先于类加载器的默认断言状态,并且可以通过调用
setClassAssertionStatus(String, boolean)在每个类的基础上覆盖 。- 参数
-
packageName- 要设置其包默认断言状态的包的名称。 Anull值表示未命名的包为“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
-
-