- 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二进制的形式
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
ClassLoader()
创建使用一个新的类加载器ClassLoader
该方法返回getSystemClassLoader()
作为父类加载器。protected
ClassLoader(ClassLoader parent)
使用指定的父类加载器创建新的类加载器以进行委派。protected
ClassLoader(String name, ClassLoader parent)
创建具有指定名称的新类加载器,并使用指定的父类加载器进行委派。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 void
clearAssertionStatus()
将此类加载器的默认断言状态设置为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 String
findLibrary(String libname)
返回本机库的绝对路径名。protected 类<?>
findLoadedClass(String name)
返回给定类 binary name如果装载机已记录由Java虚拟机作为与一类的初始化加载器 binary name 。protected URL
findResource(String name)
查找具有给定名称的资源。protected URL
findResource(String moduleName, String name)
返回定义到此类加载器的模块中的资源的URL。protected Enumeration<URL>
findResources(String name)
返回表示具有给定名称的所有资源的URL
对象的枚举。protected 类<?>
findSystemClass(String name)
查找具有指定的 binary name的类,必要时加载它。protected Object
getClassLoadingLock(String className)
返回类加载操作的锁定对象。软件包
getDefinedPackage(String name)
返回软件包
给定的 name已经被这个类加载器定义。软件包[]
getDefinedPackages()
返回此类加载器定义的所有软件包
。String
getName()
如果未指定此类加载器,则返回此类加载器的名称或null
。protected 软件包
getPackage(String name)
已过时。如果多个类加载器相互委托并定义具有相同包名的类,并且一个这样的加载器依赖于getPackage
的查找行为从父加载器返回软件包
,那么软件包
公开的属性可能不是预期的该计划的其余部分。protected 软件包[]
getPackages()
返回此类加载器及其祖先定义的所有软件包
。ClassLoader
getParent()
返回委托的父类加载器。static ClassLoader
getPlatformClassLoader()
返回平台类加载器。URL
getResource(String name)
查找具有给定名称的资源。InputStream
getResourceAsStream(String name)
返回用于读取指定资源的输入流。Enumeration<URL>
getResources(String name)
查找具有给定名称的所有资源。static ClassLoader
getSystemClassLoader()
返回系统类加载器。static URL
getSystemResource(String name)
从用于加载类的搜索路径中查找指定名称的资源。static InputStream
getSystemResourceAsStream(String name)
打开以便从用于加载类的搜索路径中读取指定名称的资源。static Enumeration<URL>
getSystemResources(String name)
从用于加载类的搜索路径中查找指定名称的所有资源。模块
getUnnamedModule()
返回此类加载器的未命名模块
。boolean
isRegisteredAsParallelCapable()
类<?>
loadClass(String name)
使用指定的 binary name加载类。protected 类<?>
loadClass(String name, boolean resolve)
使用指定的 binary name加载类。protected static boolean
registerAsParallelCapable()
将呼叫者注册为 parallel capable 。protected void
resolveClass(类<?> c)
链接指定的类。Stream<URL>
resources(String name)
返回一个流,其元素是具有给定名称的所有资源的URL。void
setClassAssertionStatus(String className, boolean enabled)
为此类加载器中指定的顶级类及其中包含的任何嵌套类设置所需的断言状态。void
setDefaultAssertionStatus(boolean enabled)
设置此类加载器的默认断言状态。void
setPackageAssertionStatus(String packageName, boolean enabled)
设置命名包的包默认断言状态。protected void
setSigners(类<?> 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 ofgetPackage
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 thepackage-info.class
file defined by the parent loader, even if annotations exist in apackage-info.class
file 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
-
-