Java类加载器的简单总结

类加载器分两种:jvm自带的类加载器和用户自定义类加载器

jvm自带的类加载器:启动类加载器、扩展类加载器、系统类加载器

启动类加载器(Boostrap ClassLoader):由C++编写,用于加载%JAVA_HOME%/jre/lib下的jar包,是顶级类加载器。

扩展类加载器(Extension ClassLoader):由java编写,用于加载%JAVA_HOME%/jre/lib/ext下的jar包,其父加载器是启动类加载器,这里所说的父子关系并不是指java语言中的继承关系,而是和类加载器的双亲委派机制有关系。

系统类加载器(System ClassLoader):由java编写,用于加载classpath下面的类文件,其父类加载器是扩展类加载器。

用户自定义类加载器:用户自定义的类加载器必须继承ClassLoader抽象类,且可以在构造函数中设置父类加载器,默认是系统类加载器。

类加载的过程分为:加载--》链接--》初始化

其中链接过程又分为:验证--》准备--》解析

加载:将字节码文件加载到内存并使用它创建一个Class对象。

验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身的安全。

准备:给类的静态变量(static)分配内存并赋默认值。

解析:将符号引用替换成直接引用。

初始化:类加载的最后阶段,若该类具有超类,则对其进行初始化,这里的初始化指给变量赋用户指定的值,而非默认值。

双亲委派机制:指当一个类加载器接收到加载类请求时,并不会马上自己去加载,而是将请求委托给它的父加载器,如果它的父加载器还有父加载器,则依次向上委托,请求最终到达顶层的启动类加载器。如果父加载器可以完成加载任务,则成功返回,如果不能则交给子类加载器,依次向下传递,直到遇到可以成功加载的子类加载器或者无法加载返回异常。

双亲委派机制的优点:

1.避免类的重复加载,在jvm中不同类加载器加载的同一个类是不相同的,如果父加载器已经加载了该类,则父加载器直接返回该类,那么子加载器就不会重复加载。

2.更加安全,java核心api中定义的类不会被随意替换,如果从网络上传递一个名为java.lang.String的类,通过双亲委派机制传递到启动类加载器后,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.String,而直接返回已加载过的String.class,这样便可以防止核心API库被随意篡改。

参考博文:博文1

猜你喜欢

转载自blog.csdn.net/imonkeyi/article/details/105931387
今日推荐