Java类的加载及单亲委派模型

it2025-06-25  3

类的生命周期:

加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载。

其中,类的加载过程是

加载->链接(验证+准备+解析)->初始化(使用前的准备)

验证是验证代码合法性

准备是创建静态变量以及设置静态变量的初始值(重点在分配内存空间)

解析是常量池中的符号引用替换为直接引用

初始化是 执行初始化逻辑以及执行静态初始化块内的逻辑

这里有个图比较清晰明了:

类的加载机制:单亲委派模型

 

这里的加载逻辑是:

自定义加载器委托给App类加载器,App类加载器再委托给拓展类加载器,拓展类加载器再委托给根类加载器,此时若根类加载器加载不了,就由拓展类加载器加载,若拓展类加载器加载失败,则由App类加载器加载,若失败,再由自定义类加载器加载。

 

自定义类加载器:继承ClassLoader类。来自Class Loaders in Java

public class CustomClassLoader extends ClassLoader { @Override public Class findClass(String name) throws ClassNotFoundException { byte[] b = loadClassFromFile(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassFromFile(String fileName) { InputStream inputStream = getClass().getClassLoader().getResourceAsStream( fileName.replace('.', File.separatorChar) + ".class"); byte[] buffer; ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); int nextValue = 0; try { while ( (nextValue = inputStream.read()) != -1 ) { byteStream.write(nextValue); } } catch (IOException e) { e.printStackTrace(); } buffer = byteStream.toByteArray(); return buffer; } }

 

最新回复(0)