概述
类加载器是负责加载类的。是一个抽象类。 给定类的二进制名称,类加载器应尝试查找或生成构成该类定义的数据。 一种典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。 每一个类对象都包含了一个引用,指向定义它的类加载器。 Array的类对象,不是有类加载器创建的,而是由java runtime自动创建的。 由 Class.getClassLoader() 方法返回的Array 的类加载器,与其元素类型的类加载器相同 如果元素类型是原始类型,则数组没有类加载器。应用程序实现ClassLoader的子类,以扩展Java虚拟机动态加载类的方式。安全管理器通常可以使用类加载器来指示安全域。当请求查找类或资源时,ClassLoader 实例会将对类或资源的搜索委托给其父类加载器,然后再尝试查找类或资源本身。 虚拟机的内置类加载器(称为“boostrap类加载器”)本身没有父级,但可以用作ClassLoader实例的父级。 支持并发加载的类称为并发类加载器。 它们在类初始化时调用 registerAsParallelCapable() 方法注册自己。 ClassLoader类默认注册为并发的。 它的子类如果是支持并发的,仍然需要注册自身。 在委派模型不是严格分层的环境中,类加载器需要具有并行功能,否则类加载会导致死锁,因为在类加载过程中会保持加载器锁 通常,Java虚拟机以平台相关的方式从本地文件系统加载类。 例如,在UNIX系统上,虚拟机从 CLASSPATH 环境变量定义的目录中加载类。 然而,某些类可能不是源自文件的。它们可能从其他来源,例如网络,或者它们可以被一个应用创建。 defineClass() 方法将一个字节数组转化为一个Class类的实例。 就可以使用 newInstance()方法创建一个新等一的类的实例。 由类加载器创建的对象的方法和构造函数可以引用其他类。 为了确定所引用的类,Java虚拟机将调用最初创建该类的类加载器的{@link #loadClass loadClass }方法
继承关系
public abstract class ClassLoader 是一个抽象类 没有父类
成员属性
构造器
关键方法
loadClass()
使用指定的 二进制名称 加载类。
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
getResource()
用给定的名称去寻找资源。 资源使一些能被类的代码访问的数据(),这些数据依赖代码的位置。 资源的名称是用"/"分割的路径名称,用来识别资源。 此方法将首先在父类加载器中搜索资源; 如果父级为null,则会搜索虚拟机内置的类加载器的路径。 失败的话,此方法将调用findResource来查找资源。
public URL getResource(String name)
getResources()
查找具有给定名称的所有资源。资源是某些数据(图像,音频,文本等),可以由类代码以与代码位置无关的方式进行访问。重写此方法时,建议实现确保所有委托与getResource(String)方法一致。这应该确保枚举的nextElement方法返回的第一个元素与getResource(String)方法将返回的资源相同。
public Enumeration<URL> getResources(String name) throws IOException
getSystemResource()
从指定的搜索路径中,用指定的名称去寻找资源,以加载类。这个方法通过系统类加载器去定位资源。
public static URL getSystemResource(String name)
getSystemResources()
从指定的搜索路径中,用指定的名称去寻找所有资源,以加载类。 寻找到的资源会以URL对象的Enumeration形式返回。
public static Enumeration<URL> getSystemResources(String name) throws IOException
getResourceAsStream()
返回一个输入流,来读取指定的资源
public InputStream getResourceAsStream(String name)
getSystemResourceAsStream()
为了读取而打开,它是从用于加载类的搜索路径中指定名称的资源。此方法通过系统的类加载器寻找资源。
public static InputStream getSystemResourceAsStream(String name)
getParent()
如果存在安全管理器,并且调用者的类加载器不是null,并且不是该类的祖先,该方法会 以RuntimePermission权限,调用安全管理器的checkPermission方法,以检查是否具有父类加载器的访问权限。如果没有权限,会抛出 SecurityException 异常。
@CallerSensitive public final ClassLoader getParent()
getSystemClassLoader()
返回用于委托的系统类加载器。这是新的ClassLoader实例的默认委派父级,通常是用于启动应用程序的类加载器。
@CallerSensitive
public static ClassLoader getSystemClassLoader()
setDefaultAssertionStatus()
为类加载器 设置默认的 断言状态。
public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus()
包默认的assertion status 决定了该包的子包的assertion status
public void setPackageAssertionStatus(String packageName, boolean enabled)
setClassAssertionStatus()
为该类加载器及其中包含的任何嵌套类的命名顶级类设置所需的声明状态。此设置优先于类加载器的默认断言状态和任何适用的每包默认设置。如果命名类已经初始化,则此方法无效。 (一旦类被初始化,其声明状态就无法更改。)
public void setClassAssertionStatus(String className, boolean enabled)
clearAssertionStatus()
将此类加载器的默认声明状态设置为false,并丢弃任何与该类加载器关联的程序包默认值或类声明状态设置。提供此方法是为了使类加载器可以忽略任何命令行或持久性断言状态设置,并“从头开始”。
public void clearAssertionStatus()
希望和大家多多交流
我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。