类加载器

三种系统提供的类加载器:

  1. 启动类加载器(Bootstrap):这个类加载器负责将放在JAVA_HOME/lib目录下的类库记载到虚拟机内存中,这个加载器无法被程序引用
  2. 扩展类加载器(Extension):由sun.misc.Launcher$ExtClassLoader实现,负责加载JAVA_HOME/lib/ext目录或者java.ext.dirs指定的路径的类库
  3. 应用程序类加载器(Application):由sun.misc.Launcher$AppClassLoader实现,负责加载用户类路径上指定的类库(CLASSPATH指定的类库),一般情况下这个就是程序中默认的类加载器

加载路径简单描述:

BootStrap –>JRE/lib/rt.jar
ExtClassLoader–>JRE/lib/ext/*.jar
AppClassLoader–>CLASSPATH指定的所有jar或目录
(配置环境变量,让AppClassLoader这个类加载器能去加载我们写的类)

双亲委派模型

如果一个类加载器收到了类加载的请求,首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,如果父类加载器无法无法完成这个加载请求,子类加载器才会尝试自己去加载,这是推荐的类加载器模型

问题:能不能自己写一个类加载java.lang.System?

回答:类加载采用委托机制,总是保证父类优先与子类,也就是如果父类找到了你委托它加载的类,那么它直接把加载完的字节码给你,由于BootStrap(启动类加载器)可以加载rt.jar下面有System这个类,所以总是由BootStrap来加载System类,而不是用我们自己编写的类加载器来加载.

代码例子

      /*
       * 类加载器有3个: BootStrap,ExtClassLoader,AppClassLoader
       */
      System.out.println(test.class.getClassLoader().getClass().getName());
// 打印出AppClassLoader,由AppClassLoader加载的
System.out.println(System.class.getClassLoader());
// 打印出null,由BootStrap加载的

// 测试3个类加载器的父子关系
ClassLoader loader = test.class.getClassLoader();
while(loader !=null) {
    System.out.println(loader.getClass().getName());
    loader = loader.getParent();
}
System.out.println(loader);
      /*
       * 打印出AppClassLoader----的父类-->ExtClassLoader----的父类-->BootStrap,
       * BootStrap是最顶部的类加载 
       */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值