类加载我程序员在学习编程开发技术的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java类加载的概念与常用加载方式都有哪些。

Java运行时类增加方法 java类加载方式_类加载器

什么是类加载器

类加载器(ClassLoader)就是在系统运行过程中动态的将字节码文件加载到JVM中的工具,基于这个工具的整套类加载流程,我们称作类加载机制。我们在IDE中编写的都是源代码文件,以后缀名.java的文件形式存在于磁盘上,通过编译后生成后缀名.class的字节码文件,ClassLoader加载的就是这些字节码文件。

双亲委派

当我们要加载一个应用程序classpath下的自定义类时,AppClassLoader会先查看自己是否已经加载过这个类,如果已经加载过则直接返回类的实例,否则将加载任务委托给自己的父加载器ExtClassLoader。同样,ExtClassLoader也会先查看自己是否已经加载过这个类,如果已经加载过则直接返回类的实例,否则将加载任务委托给自己的父加载器BootStrapClassLoader。

BootStrapClassLoader收到类加载任务时,会先检查自己是否已经加载过这个类,如果已经加载则直接返回类的实例,否则在自己负责的加载路径下搜索这个类并尝试加载。如果找到了这个类,则执行加载任务并返回类实例,否则将加载任务交给ExtClassLoader去执行。

ExtClassLoader同样也在自己负责的加载路径下搜索这个类并尝试加载。如果找到了这个类,则执行加载任务并返回类实例,否则将加载任务交给AppClassLoader去执行。

全盘负责

「全盘负责」是类加载的另一个原则。它的意思是如果类A是被类加载器X加载的,那么在没有显示指定别的类加载器的情况下,类A引用的其他所有类都由类加载器X负责加载,加载过程遵循「双亲委派」原则。

为什么需要自定义类加载器

自定义类加载器的用处有很多,这里简单列举一些常见的场景。

从任意位置加载类。JVM预定义的三个类加载器都被限定了自己的类路径,我们可以通过自定义类加载器去加载其他任意位置的类。

解密类文件。比如我们可以对编译后的类文件进行加密,然后通过自定义类加载器进行解密。当然这种方法实际并没有太大的用处,因为自定义的类加载器也可以被反编译。

支持更灵活的内存管理。我们可以使用自定义类加载器在运行时卸载已加载的类,从而更高效的利用内存。