类加载器

本贴最后更新于 2811 天前,其中的信息可能已经时移俗易

三种系统提供的类加载器

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

加载路径简单描述:

BootStrap –>JRE/lib/rt.jar
ExtClassLoader–>JRE/lib/ext/*.jar
AppClassLoader–>CLASSPATH 指定的所有 jar 或目录

双亲委派模型

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

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

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

测试代码

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是最顶部的类加载 
 */
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • 类加载器
    1 引用 • 1 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...