- java.lang.Object
-
- java.lang.ClassLoader
-
- 已知直接子类:
-
SecureClassLoader
public abstract class ClassLoader extends Object
类加载器是一个负责加载类的对象。ClassLoader类是一个抽象类。 给定类的binary name ,类加载器应该尝试定位或生成构成类定义的数据。 典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个
类对象包含一个reference到ClassLoader定义它。类数组类的对象不是由类加载器创建的,而是根据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(); . . .网络类加载器子类必须定义方法
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二进制的形式
-
-
构造方法摘要
构造方法 变量 构造器 描述 protectedClassLoader()创建使用一个新的类加载器ClassLoader该方法返回getSystemClassLoader()作为父类加载器。protectedClassLoader(ClassLoader parent)使用指定的父类加载器创建新的类加载器以进行委派。protectedClassLoader(String name, ClassLoader parent)创建具有指定名称的新类加载器,并使用指定的父类加载器进行委派。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 voidclearAssertionStatus()将此类加载器的默认断言状态设置为false并丢弃与类加载器关联的任何包默认值或类断言状态设置。protected 类<?>defineClass(byte[] b, int off, int len)protected 类<?>defineClass(String name, byte[] b, int off, int len)将字节数组转换为类类的实例。protected 类<?>defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)将字节数组转换为类类的实例,给定ProtectionDomain。protected 类<?>defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain)将ByteBuffer转换为类类的实例,给定ProtectionDomain。protected 软件包definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase)在 ClassLoader中定义一个包ClassLoader。protected 类<?>findClass(String name)查找具有指定的类 binary name 。protected 类<?>findClass(String moduleName, String name)在为此类加载器定义的模块中查找具有给定 binary name的类。protected StringfindLibrary(String libname)返回本机库的绝对路径名。protected 类<?>findLoadedClass(String name)返回给定类 binary name如果装载机已记录由Java虚拟机作为与一类的初始化加载器 binary name 。protected URLfindResource(String name)查找具有给定名称的资源。protected URLfindResource(String moduleName, String name)返回定义到此类加载器的模块中的资源的URL。protected Enumeration<URL>findResources(String name)返回表示具有给定名称的所有资源的URL对象的枚举。protected 类<?>findSystemClass(String name)查找具有指定的 binary name的类,必要时加载它。protected ObjectgetClassLoadingLock(String className)返回类加载操作的锁定对象。软件包getDefinedPackage(String name)返回软件包给定的 name已经被这个类加载器定义。软件包[]getDefinedPackages()返回此类加载器定义的所有软件包。StringgetName()如果未指定此类加载器,则返回此类加载器的名称或null。protected 软件包getPackage(String name)已过时。如果多个类加载器相互委托并定义具有相同包名的类,并且一个这样的加载器依赖于getPackage的查找行为从父加载器返回软件包,那么软件包公开的属性可能不是预期的该计划的其余部分。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)从用于加载类的搜索路径中查找指定名称的所有资源。模块getUnnamedModule()返回此类加载器的未命名模块。booleanisRegisteredAsParallelCapable()类<?>loadClass(String name)使用指定的 binary name加载类。protected 类<?>loadClass(String name, boolean resolve)使用指定的 binary name加载类。protected static booleanregisterAsParallelCapable()将呼叫者注册为 parallel capable 。protected voidresolveClass(类<?> c)链接指定的类。Stream<URL>resources(String name)返回一个流,其元素是具有给定名称的所有资源的URL。voidsetClassAssertionStatus(String className, boolean enabled)为此类加载器中指定的顶级类及其中包含的任何嵌套类设置所需的断言状态。voidsetDefaultAssertionStatus(boolean enabled)设置此类加载器的默认断言状态。voidsetPackageAssertionStatus(String packageName, boolean enabled)设置命名包的包默认断言状态。protected voidsetSigners(类<?> 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 类<?> loadClass(String name) throws ClassNotFoundException
使用指定的binary name加载类。 此方法以与loadClass(String, boolean)方法相同的方式搜索类。 它由Java虚拟机调用以解析类引用。 调用此方法相当于调用loadClass(name, false)。- 参数
-
name- 该 类别的binary name - 结果
-
由此产生的
类对象 - 异常
-
ClassNotFoundException- 如果找不到课程
-
loadClass
protected 类<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
使用指定的binary name加载类。 此方法的默认实现按以下顺序搜索类:调用
findLoadedClass(String)以检查是否已加载该类。在父类加载器上调用
loadClass方法。 如果父级是null,则使用内置到虚拟机中的类加载器。调用
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。 - 实现要求:
-
当
moduleName为null时,默认实现尝试通过调用findClass(String)来查找该类。 否则返回null。 - 参数
-
moduleName- 模块名称; 或者null在unnamed module中为此类加载器查找类 -
name- 该 类别中的 binary name - 结果
-
得到的
类对象,或null如果类不能被发现。 - 从以下版本开始:
- 9
-
defineClass
@Deprecated(since="1.1") protected final 类<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
Deprecated.Replaced bydefineClass(String, byte[], int, int)- 参数
-
b- 组成类数据的字节。 位置off到off+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。 -
off- 类数据的b中的起始偏移量 -
len- 类数据的长度 - 结果
-
从指定的类数据创建的
类对象 - 异常
-
ClassFormatError- 如果数据不包含有效类 -
IndexOutOfBoundsException- 如果off或len为负数,或者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- 组成类数据的字节。 位置off到off+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。 -
off- 类数据的b中的起始偏移量 -
len- 类数据的长度 - 结果
-
从指定的类数据创建的
类对象。 - 异常
-
ClassFormatError- 如果数据不包含有效类 -
IndexOutOfBoundsException- 如果off或len为负数,或者off+len大于b.length。 -
SecurityException- 如果尝试将此类添加到包含由除此类(未签名)之外的其他证书集签名的类的包,或者name以“java.”开头。 - 从以下版本开始:
- 1.1
- 另请参见:
-
loadClass(String, boolean),resolveClass(Class),CodeSource,SecureClassLoader
-
defineClass
protected final 类<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
将字节数组转换为类类的实例,给定ProtectionDomain。如果给定的
ProtectionDomain是null,则将为该类分配默认保护域,如defineClass(String, byte[], int, int)的文档中所指定。 在可以使用该类之前,必须解决它。包中定义的第一个类确定该包中定义的所有后续类必须包含的确切证书集。 一个类的证书集是从该类的ProtectionDomain中的
ProtectionDomain获得的。 添加到该程序包的任何类都必须包含相同的证书集,SecurityException将抛出SecurityException。 请注意,如果name是null,则不执行此检查。 您应该始终传入您定义的类的binary name以及字节。 这可以确保您定义的类确实是您认为的类。如果指定的
name以“java.”开头,则只能由platform class loader或其祖先定义; 否则将被抛出SecurityException。 如果name不是null,它必须等于binary name由字节数组指定的类的b,否则NoClassDefFoundError将被抛出。此方法在此类加载器中定义与
类的包对应的包(如果此类包尚未在此类加载器中定义)。 所定义的包的名称是从衍生binary name由字节数组指定的类的b。 已定义包的其他属性由软件包指定。- 参数
-
name-name的预期 binary name ,或null如果不知道) -
b- 组成类数据的字节。 位置off到off+len-1的字节应具有The Java™ Virtual Machine Specification定义的有效类文件的格式。 -
off- 类数据的b中的起始偏移量 -
len- 类数据的长度 -
protectionDomain- 该ProtectionDomain - 结果
-
从数据创建的
类对象和ProtectionDomain。 - 异常
-
ClassFormatError- 如果数据不包含有效类 -
NoClassDefFoundError- 如果name不是null且不等于 b指定的类的b -
IndexOutOfBoundsException- 如果off或len为负数,或者off+len大于b.length。 -
SecurityException- 如果尝试将此类添加到包含由不同于此类的证书集签名的类的包,或者name以“java.”开头并且此类加载器不是平台类加载器或其类祖先。
-
defineClass
protected final 类<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
将ByteBuffer转换为类类的实例,给定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。 - 结果
-
从数据创建的
类对象和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- 如果c是null。 - 另请参见:
-
defineClass(String, byte[], int, int)
-
findSystemClass
protected final 类<?> findSystemClass(String name) throws ClassNotFoundException
查找具有指定的binary name的类,必要时加载它。此方法通过系统类加载器加载类(请参阅
getSystemClassLoader())。 返回的类对象可能有多个ClassLoader关联的ClassLoader。ClassLoader子类通常不需要调用此方法,因为大多数类加载器只需要覆盖findClass(String)。- 参数
-
name- 该 类别中的 binary name - 结果
-
类对象为指定的name - 异常
-
ClassNotFoundException- 如果找不到该课程 - 另请参见:
-
ClassLoader(ClassLoader),getParent()
-
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.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)方法一致。 这应该确保Enumeration的nextElement方法返回的第一个元素与getResource(String)方法返回的资源相同。 - 实现要求:
-
默认实现将首先在父类加载器中搜索资源;
如果父级是
null,则搜索内置到虚拟机中的类加载器的路径。 然后调用findResources(String)以在此类加载器中查找具有名称的资源。 它返回一个枚举,其元素是通过搜索父类加载器后跟找到的findResources找到的元素找到的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)
查找具有给定名称的资源。 类加载器实现应该重写此方法。对于命名模块中的资源,该方法必须实现
模块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 。 当且仅当满足以下所有条件时,注册才会成功:- 没有创建调用者的实例
- 调用者的所有超类(除了类Object)都被注册为并行能力
请注意,一旦类加载器注册为并行功能,就无法将其更改回来。
- 结果
-
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- 资源名称 - 结果
-
资源
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 模块 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- 如果name是null。 -
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- 如果name是null。 - 从以下版本开始:
- 9
- See The Java™ Virtual Machine Specification:
- 5.3运行时包
-
getDefinedPackages
public final 软件包[] getDefinedPackages()
返回此类加载器定义的所有软件包。 返回的数组没有重复的软件包同名。- API Note:
-
此方法返回一个数组而不是
Set或Stream,以与现有的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 ofgetPackageto 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 thepackage-info.classfile defined by the parent loader, even if annotations exist in apackage-info.classfile defined by a child loader. A more robust approach is to use thegetDefinedPackage(java.lang.String)method which returns a软件包for the specified class loader.在此类加载器及其祖先中找到name的软件包。如果这个类装载器定义
软件包给定的名称,该软件包返回。 否则,软件包递归方式(父级父级)搜索此类加载器的祖先,以软件包给定名称的软件包。- API Note:
-
platform class loader可以委托给应用程序类加载器,但应用程序类加载器不是它的祖先。 在平台类加载器上调用时,此方法将找不到为应用程序类加载器定义的包。 - 参数
-
name- package name - 结果
-
该
软件包已经被这个类加载器或其祖先,或定义的给定名称null如果没有找到。 - 异常
-
NullPointerException- 如果name是null。 - 从以下版本开始:
- 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.util和java.lang.reflect是子包java。如果多个包默认值适用于给定的类,则与特定包最相关的包默认优先于其他包。 例如,如果
javax.lang和javax.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
-
-