【Java】谈谈ClassLoader
一,概述
类加载器,顾名思义,就是通过class字节码生成Class对象的类
以下是ClassLoader的基本用途,即通过bytes字节码,生成一个class实例对象,
二,双亲委派
基于jdk21分析:
Java中ClassLoader有一套默认加载Class流程,称为双亲委派机制,它能实现类的唯一、安全加载,也避免了系统核心类被篡改。
jdk.internal.loader定义了三个核心ClassLoader,如下
注意到以上ClassLoader关系
APP_LOADER#parent == PLATFORM_LOADER;
PLATFORM_LOADER#parent == BOOT_LOADER;
BOOT_LOADER#parent == NULL
再看ClassLoader#loadClass默认实现,
1,从已经加载过的Class池中找到class,这即表明一个Class只加载一次;
2,优先从parent中加载Class,如果parent == null,则表示是BootClassLoader,通过findBootstrapClass加载,
3,如果parent加载类返回null,则通过自身findClass方法加载类,
实际的类加载,则在BuiltInClassLoader中重写,但仍是双亲委派
以上,便是双亲委派机制的核心实现,即类的加载依次从
BOOT_LOADER->PLATFORM_LOADER->APP_LOADER,
优先从BOOT_LOADER加载核心类,
再从PLATOFORM_LOADER加载依赖类,
最后加载App自身的类,
这避免了核心类被篡改,如java.lang.String(本地定义一个此类),
通过App加载自身类,调用findClass方法,APP_LOADER默认实现在BuiltInClassLoader#findClass
以上即在本地路径中查到class文件,通过defineClass解析生成Class,并且保存至环境中,便只加载了一次Class。
三,打破双亲委派
基于二的分析,使用APP_L