了解java的类加载器

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 语言的一个创新。它使得动态安装和更新软件组件成为可能

以上这些只是加载器的一些基本的知识,参考的网上一些讲解,具体的使用场景暂时尚未深入了解,分享给大家。

 

原文地址:https://www.cnblogs.com/gstsyyb/p/3475067.html