1.java运行之前,编译后的class文件需要加载到虚拟机内存,这必须用到class的加载器来加载,所以有必要了解加载器原理。
2.加载器采用父类委派机制加载,这样的目的是保证基础类仅仅加载一次(比如JDK里面的Object等),防止自定义加载器破坏原有的代码结构以及类组织关系,一句话,就是安全使用。
3.看一张图(网上找的)。
4.了解一下ClassLoader 这个类(一般扩展这个类,为自定义打开的一个HOOK钩子或者回调函数或者缺口)
getParent() 返回该类加载器的父类加载器。
loadClass(String name) 加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findClass(String name) 查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。
findLoadedClass(String name) 查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。
defineClass(String name, byte[] b, int off, int len) 把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类的实例。这个方法被声明为 final 的。
resolveClass(Class<?> c) 链接指定的 Java 类。
5. 真正完成类的加载工作是通过调用 defineClass
来实现的。--------- 定义加载器(defining loader)
启动类的加载过程是通过调用 loadClass
来实现的 ---------- 初始加载器(initiating loader)
在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载 器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的其它类的初始加载器
6. 类加载器是 Java 语言的一个创新。它使得动态安装和更新软件组件成为可能
以上这些只是加载器的一些基本的知识,参考的网上一些讲解,具体的使用场景暂时尚未深入了解,分享给大家。