Java类的加载机制-双亲委派机制

本文介绍了Java的类加载机制,特别是双亲委派机制的工作原理及其重要性。文章详细解释了三种默认类加载器:启动类加载器、扩展类加载器和应用程序类加载器的作用与职责。

Java类的加载机制-双亲委派机制

jdk8默认的类加载器有三种

  • 启动类加载器–Bootstrap ClassLoader
  • 扩展类加载器–Extension ClassLoader
  • 应用程序类加载器–Application ClassLoader

启动类加载器(Bootstrap ClassLoader)是虚拟机实现的,通过getparent方法时拿不到的,为null,启动类加载器主要是负责加载java的基础类,jdk文件夹中lib文件夹目录中jar包的类

扩展类加载器(Extension ClassLoader)是sun.misc.Launcher包中的ExtClassLoader类实现的,主要负责加载JDK中一些扩展的jar,如lib文件夹中ext目录中的jar文件

应用程序类加载器(Application ClassLoader)是sun.misc.Launcher包中的AppClassLoader类实现的,主要负责加载应用程序的类,包括自己实现的类与引入的第三方类库,即会加载整个java程序目录中的所有指定的类

双亲委派机制:其实就是说的这三种加载器的加载顺序,当每一个加载器在加载时,都会先交给父加载器去加载,如果父加载器不能加载,才由当前加载器去加载,这样做的好处就是可以防止覆盖系统默认的类,比如说自己创建了一个String类,先由AppClassLoader类加载,这个时候AppClassLoader类会先让ExtClassLoader类加载,ExtClassLoader类又会让Bootstrap ClassLoader类去加载,而Bootstrap ClassLoader类会发现有系统默认的String类,然后加载系统默认的String类并返回系统默认的,所以最终加载到jvm的就是系统默认得到String,可以有效防止覆盖掉系统默认的类,也就是给定了类加载的优先级

jvm初始化的时候,会创建BootstrapClassLoader,然后创建ExtClassLoader,并把BootstrapClassLoader设为ExtClassLoader的父加载器,在创建AppClassLoader,并且把ExtClassLoader设为AppClassLoader的父加载器,这个时候由AppClassLoader加载helloworld类,一层层的传递上去。

public class User {
   static {
      System.out.println("user的static代码块");
   }
}
Class aClass = Class.forName("com.demo.User", false, systemClassLoader);
System.out.println(aClass);
Class userClass = systemClassLoader.loadClass("com.demo.User");
System.out.println(userClass);
class com.demo.User
class com.demo.User

Class.forName()方法可以控制是否输出static代码块的内容,systemClassLoader.loadClass()方法默认不输出static代码块的内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值