public abstract class ClassLoader extends Object
每一类
对象包含一个reference
到定义的ClassLoader它。
数组类类对象是由类装载器创建,但创建的java运行时所需的自动。数组类的类装载器,返回的Class.getClassLoader()
为元素类型的类装载器相同;如果元素类型是简单类型,那么数组类没有类加载器。
应用程序实现的子类ClassLoader为了延长,java虚拟机动态加载类的方式。
类装载器通常可由安全管理器使用,以指示安全域。
的ClassLoader类使用一个代理模型搜索类和资源。ClassLoader的每个实例都有一个相关的父类装载器。当被要求找到一个类或资源,一个ClassLoader实例将代表资源或类的父类装载器搜索前试图寻找资源或类本身。虚拟机的内置的类装载器,被称为“引导类加载器”,本身并没有一个家长但可以作为一个ClassLoader实例的父。
类装载器,支持并行加载的类被称为并行能力的类装载机和被要求登记自己的类初始化的时候通过调用ClassLoader.registerAsParallelCapable
方法。请注意,ClassLoader类注册为默认的并行能力。然而,它的子类仍然需要注册自己,如果他们是平行的能力。在环境中的授权模型是不严格的分层
,类加载器需要并行能力,否则可能导致死锁,因为类加载的加载程序锁举行的类加载过程的持续时间(见loadClass
方法)。
通常,java虚拟机负载类从本地文件系统在一个平台依赖性。例如,在UNIX系统中,虚拟的CLASSPATH环境变量中定义的目录机负载类。
然而,一些类可能不是源于一个文件,它们可能来自其他来源,如网络,或它们可以由应用程序构造。方法defineClass
将字节数组转换为类的一个实例类。这个新定义的类的实例可以创建使用Class.newInstance
。
类装载器创建的对象的方法和构造函数可以引用其他类。确定类(ES)的简称,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 . . . } }
任何类的名字作为ClassLoader方法String
参数必须是一个二进制的名字所定义的The Java™ Language Specification。
有效的类名称的例子包括:
"java.lang.String" "javax.swing.JSpinner$DefaultEditor" "java.security.KeyStore$Builder$FileBuilder$1" "java.net.URLClassLoader$3$1"
resolveClass(Class)
Modifier | Constructor and Description |
---|---|
protected |
ClassLoader()
创建一个新的类装载器使用
ClassLoader返回的方法
getSystemClassLoader() 作为父类装载器。
|
protected |
ClassLoader(ClassLoader parent)
使用指定的父类加载程序创建一个新的类装载器。
|
Modifier and Type | Method and Description |
---|---|
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。
|
protected 类<?> |
findClass(String name)
发现指定
binary name类。
|
protected String |
findLibrary(String libname)
返回本地库的绝对路径名。
|
protected 类<?> |
findLoadedClass(String name)
返回与给定的
binary name如果装载机已由java虚拟机的记录为一个类,
binary name启动加载器的类。
|
protected URL |
findResource(String name)
查找给定名称的资源。
|
protected Enumeration<URL> |
findResources(String name)
返回
URL 对象代表了所有具有给定名称的资源枚举。
|
protected 类<?> |
findSystemClass(String name)
发现指定
binary name类,加载必要的。
|
protected Object |
getClassLoadingLock(String className)
返回类加载操作的锁定对象。
|
protected 软件包 |
getPackage(String name)
返回一个
软件包已经由这类装载器或其祖先的定义。
|
protected 软件包[] |
getPackages()
返回所有的
Packages定义的类装载器和它的祖先。
|
ClassLoader |
getParent()
返回代理的父类加载程序。
|
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)
查找用于加载类的搜索路径中指定的指定名称的所有资源。
|
类<?> |
loadClass(String name)
加载指定的
binary name类。
|
protected 类<?> |
loadClass(String name, boolean resolve)
加载指定的
binary name类。
|
protected static boolean |
registerAsParallelCapable()
将调用方注册为并行能力。
|
protected void |
resolveClass(类<?> c)
链接指定的类。
|
void |
setClassAssertionStatus(String className, boolean enabled)
为该类装载器中的顶级类和其中包含的任何嵌套类设置所需的断言状态。
|
void |
setDefaultAssertionStatus(boolean enabled)
为该类装载器设置默认断言状态。
|
void |
setPackageAssertionStatus(String packageName, boolean enabled)
为已命名的包设置包默认断言状态。
|
protected void |
setSigners(类<?> c, Object[] signers)
设置一个类的成员。
|
protected ClassLoader(ClassLoader parent)
如果存在安全管理器,它的checkCreateClassLoader
方法被调用。这可能会导致安全异常。
parent
-父类装载器
SecurityException
-如果存在一个安全管理及其
checkCreateClassLoader方法不允许一个新的类加载器的创作。
protected ClassLoader()
getSystemClassLoader()
作为父类装载器。
如果存在安全管理器,它的checkCreateClassLoader
方法被调用。这可能会导致安全异常。
SecurityException
-如果存在一个安全管理及其
checkCreateClassLoader方法不允许一个新的类加载器的创作。
public 类<?> loadClass(String name) throws ClassNotFoundException
loadClass(String, boolean)
方法。它是由java虚拟机来解决类的参考文献。调用此方法等效于调用
loadClass(name, false)
。
name
-类的
binary name
ClassNotFoundException
-如果类没有被发现
protected 类<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
调用findLoadedClass(String)
检查是否已经加载的类。
loadClass
方法调用父类装载器。如果家长null内置的虚拟机的类装载器是用于代替。
调用findClass(String)
方法找到类。
如果类是用以上的步骤,和resolve旗是真的,这个方法会调用resolveClass(Class)
方法所产生的类对象。
子类重写findClass(String)
ClassLoader鼓励,而不是这种方法。
除非重写,这种方法可以使得在getClassLoadingLock
方法结果整个类加载过程中。
name
-类的
binary name
resolve
-如果
true进而解决类
ClassNotFoundException
-如果类不能被发现
protected Object getClassLoadingLock(String className)
className
-要加载的类的名称
NullPointerException
如果注册为并行能力和
className是空的
loadClass(String, boolean)
protected 类<?> findClass(String name) throws ClassNotFoundException
loadClass
方法后检查所请求的类的父类装载器。默认实现抛出一个
ClassNotFoundException。
name
-类的
binary name
ClassNotFoundException
-如果类不能被发现
@Deprecated protected final 类<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
defineClass(String, byte[], int, int)
b
,弥补该类数据的字节。通过
off+len-1位置
off字节应该有有效的类文件格式的定义由
The Java™ Virtual Machine Specification。
off
在类的数据
b的起始偏移量
len
-该类数据的长度
ClassFormatError
-如果数据不包含一个有效的课堂
IndexOutOfBoundsException
-如果
off或
len是负的,或如果
off+len大于
b.length。
SecurityException
-如果尝试添加这类包,包含的类是由一组不同的证书比这类签名,或如果尝试定义一个类在一个包和一个完全合格的名称,以“
java.
”。
loadClass(String, boolean)
,
resolveClass(Class)
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作为一个参数。
name
-类的预期
binary name,或
null如果不知道
b
,弥补该类数据的字节。通过
off+len-1位置
off字节应该有有效的类文件格式的定义由
The Java™ Virtual Machine Specification。
off
在类的数据
b的起始偏移量
len
-该类数据的长度
ClassFormatError
-如果数据不包含一个有效的课堂
IndexOutOfBoundsException
-如果
off或
len是负的,或如果
off+len大于
b.length。
SecurityException
-如果尝试添加这类包,包含的类是由一组不同的证书比这类符号(即符号),或者如果
name始于“
java.”。
loadClass(String, boolean)
,
resolveClass(Class)
,
CodeSource
,
SecureClassLoader
protected final 类<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
defineClass(String, byte[], int, int)
文档中指定的。方法重写,继承类前可以用它必须解决。
在一个包中定义的第一类确定了一组证书,证明该包中定义的所有后续类都必须包含。一类证书的设置是从CodeSource
在班上ProtectionDomain。任何的类添加到包必须包含证书或SecurityException一样会被。注意,如果name是null,不进行检查。你应该总是在你定义以及字节的类的binary name通。这确保了您定义的类确实是您认为它是。
不能指定name开始与“java.”,因为“java.*包类只能通过引导类装入器定义。如果name不null,它必须等于由字节数组”b”指定的类binary name,否则将抛出一NoClassDefFoundError
。
name
-类的预期
binary name,或
null如果不知道
b
,弥补该类数据的字节。通过
off+len-1位置
off字节应该有有效的类文件格式的定义由
The Java™ Virtual Machine Specification。
off
在类的数据
b的起始偏移量
len
-该类数据的长度
protectionDomain
-类的保护范围
ClassFormatError
-如果数据不包含一个有效的课堂
NoClassDefFoundError
-如果
name不等于指定的类的
binary name
b
IndexOutOfBoundsException
-如果
off或
len是负的,或如果
off+len大于
b.length。
SecurityException
-如果尝试添加这类包,包含的类是由一组不同的证书比这类签名,或如果
name始于“
java.”。
protected final 类<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
ByteBuffer
到
类类实例,一个可选的
ProtectionDomain。如果域是
null,则默认的域将被分配到类中指定的文件
defineClass(String, byte[], int, int)
。课前可以用它必须解决。
在一个包,确定包证书集定义的第一类的规则,并对类名称的限制是那些defineClass(String, byte[], int, int, ProtectionDomain)
文档中指定的相同。
这种形式的空氯.defineClass(null名称, nullbbuffer, nullpd)产生完全相同的结果作为报表的方法调用
...
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
-类的保护范围,或
null。
ClassFormatError
-如果数据不包含一个有效的课堂。
NoClassDefFoundError
-如果
name不等于指定的类的
binary name
b
SecurityException
-如果尝试添加这类包,包含的类是由一组不同的证书比这类签名,或如果
name始于“
java.”。
defineClass(String, byte[], int, int, ProtectionDomain)
protected final void resolveClass(类<?> c)
c
-类连接
NullPointerException
。
defineClass(String, byte[], int, int)
protected final 类<?> findSystemClass(String name) throws ClassNotFoundException
此方法加载类系统类加载器(见getSystemClassLoader()
)。的类返回的对象可能有多个与其关联的ClassLoader。子ClassLoader需要通常不会调用此方法,因为大多数的类装载器需要重写只是findClass(String)
。
name
-类的
binary name
ClassNotFoundException
-如果类不能被发现
ClassLoader(ClassLoader)
,
getParent()
protected final 类<?> findLoadedClass(String name)
name
-类的
binary name
protected final void setSigners(类<?> c, Object[] signers)
c
-
类对象
signers
-类的签名
public URL getResource(String name)
一个资源是一个/”分离的路径名称标识的资源。
该方法首先将搜索父类装载器的资源;如果家长null内置的虚拟机的类装载器的路径搜索。这不,这个方法会调用findResource(String)
找到资源。
getResources(String)
方法一致。
name
-资源名称
public Enumeration<URL> getResources(String name) throws IOException
一种资源的名称是一个/-separated路径名称标识的资源。
搜索顺序的文档中描述的getResource(String)
。
getResource(String)
方法一致。这应确保所列举的
nextElement
方法返回的第一个元素是
getResource(String)
方法会返回相同的资源。
name
-资源名称
URL
对象枚举。如果没有找到资源,枚举将是空的。类加载程序无法访问的资源将不在枚举中。
IOException
如果I/O错误发生
findResources(String)
protected URL findResource(String name)
name
-资源名称
protected Enumeration<URL> findResources(String name) throws IOException
URL
对象枚举。类装载器实现应重写此方法,以指定从何处加载资源。
name
-资源名称
URL
对象枚举
IOException
如果I/O错误发生
protected static boolean registerAsParallelCapable()
请注意,一旦一个类装载器被注册为并行能力,就没有办法改变它回来。
public static URL getSystemResource(String name)
getSystemClassLoader()
)。
name
-资源名称
URL
对象,或
null如果资源不能被发现
public static Enumeration<URL> getSystemResources(String name) throws IOException
name
-资源名称
URL
对象枚举
IOException
如果I/O错误发生
public InputStream getResourceAsStream(String name)
搜索顺序的文档中描述的getResource(String)
。
name
-资源名称
public static InputStream getSystemResourceAsStream(String name)
getSystemClassLoader()
)。
name
-资源名称
public final ClassLoader getParent()
如果安全管理器,和调用的类装载器是不null并不是这类加载器的祖先,那么这个方法调用安全经理的checkPermission
方法与RuntimePermission("getClassLoader")
权限验证访问父类装载器是允许的。如果不是,一个SecurityException将抛出。
SecurityException
-如果存在一个安全管理及其
checkPermission方法不允许访问该类的父类装载器装载机。
public static ClassLoader getSystemClassLoader()
该方法首先调用在运行时的启动顺序,在这一点上,它创造了系统类加载器和设置它的调用Thread上下文类加载器。
默认系统类装载器是这个类的一个实现依赖实例。
如果系统性能”java.system.class.loader”指的是这种方法是首先调用然后该属性的值为一类,将为系统类加载器返回的名字。类是使用系统默认的类加载器加载,必须定义一个公共构造函数的类型ClassLoader作为代表团母单参数。然后使用此构造函数以默认的系统级加载程序为参数创建一个实例。将所得到的类装入器定义为系统类装载器。
如果安全管理器,和调用的类装载器是不null和调用的类装载器是不一样的或者一个祖先的系统类加载器,那么这个方法调用安全经理的checkPermission
方法与RuntimePermission("getClassLoader")
权限验证访问系统类加载器。如果不是,一个SecurityException将抛出。
SecurityException
-如果存在一个安全管理及其
checkPermission方法不允许访问系统类加载器。
IllegalStateException
如果递归调用的类装载器在施工过程中指定的“
java.system.class.loader”属性。
Error
-如果系统属性”
java.system.class.loader”的定义而命名类无法加载,提供程序类没有定义构造函数的需要,或是一个例外,当它被调用的构造函数抛出。错误的根本原因,可以通过
Throwable.getCause()
方法。
protected 软件包 definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) throws IllegalArgumentException
name
-包名称
specTitle
-规范标题
specVersion
的规范版本
specVendor
-规范供应商
implTitle
实施-标题
implVersion
实施-版本
implVendor
-实施供应商
sealBase
-如果不是
null,然后这个包是相对于给定对象的源代码
URL
密封。否则,包不密封。
IllegalArgumentException
如果包名称复制现有包在这类装载器或其祖先之一
protected 软件包 getPackage(String name)
name
-包名称
protected 软件包[] getPackages()
protected String findLibrary(String libname)
libname
-图书名称
System.loadLibrary(String)
,
System.mapLibraryName(String)
public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus(String, boolean)
或
setClassAssertionStatus(String, boolean)
重写。
enabled
-
true如果这类加载器加载的类将从此有断言默认启用,
false如果他们将默认禁用断言。
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断言,如果他们将默认禁用断言。
public void setClassAssertionStatus(String className, boolean enabled)
如果指定的类不是顶级类,则此调用将不会对任何类的实际断言状态产生影响。
className
的完全限定类名顶层类的断言状态被设置。
enabled
-
true如果指定的类是有断言启用时,(如果)它被初始化,
false如果类是有禁用断言。
public void clearAssertionStatus()
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.