首页 > 编程语言 >java类加载器?

java类加载器?

时间:2022-09-28 10:00:23浏览次数:77  
标签:Java ExtClassLoader ClassLoader AppClassLoader java 加载


Java类加载器ClassLoader总结

JAVA类装载方式,有两种:

1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

2.显式装载, 通过class.forname()等方法,显式加载需要的类

类加载的动态性体现:

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现

java类装载器

JDK 默认提供了如下几种ClassLoader

  1. Bootstrp loader
    Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,​-Xbootclasspath​参数指定的路径以及​%JAVA_HOME%/jre/classes​中的类。
  2. ExtClassLoader  
    Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及​java.ext.dirs​系统变量指定的路径中类库。
  3. AppClassLoader 
    Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。

综上所述,它们之间的关系可以通过下图形象的描述:

 

java类加载器?_java

 

为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型。

 类加载器之间是如何协调工作的

前面说了,java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,即java是如何区分一个类该由哪个类加载器来完成呢。 在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类

下面举一个例子来说明,为了更好的理解,先弄清楚几行代码:

Java

Public class Test{

Public static void main(String[] arg){

ClassLoader c = Test.class.getClassLoader(); //获取Test类的类加载器

System.out.println(c);

ClassLoader c1 = c.getParent(); //获取c这个类加载器的父类加载器

System.out.println(c1);

ClassLoader c2 = c1.getParent();//获取c1这个类加载器的父类加载器

System.out.println(c2);

}

}


运行结果:

Java

……AppClassLoader……

……ExtClassLoader……

Null

 

可以看出Test是由AppClassLoader加载器加载的,AppClassLoader的​​Parent​​ 加载器是 ExtClassLoader,但是​​ExtClassLoader​​​的​​Parent​​​为 ​​null​​ 是怎么回事呵,朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在​​java​​​程序代码里试图打印出其内容时,我们就会看到输出为​​null​​。

标签:Java,ExtClassLoader,ClassLoader,AppClassLoader,java,加载
From: https://blog.51cto.com/u_15765446/5718405

相关文章

  • 狂神说Java流程控制
    用户交互Scannerscanner对象之前我们学的基本语法中并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的......
  • 记一次使用spring javaconfig踩到的坑
    前言为了简化开发,我部门经常会封装一些通用的类库给业务研发使用,因为业务方的根包路径很经常和我们部门项目的根包是不一样的,因此我们会让业务方在使用我们封装的包时,扫描......
  • Java线程同步的四种方式详解(建议收藏)
    ​ Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen目录什么是线程同步线程同步的几种方式......
  • 尚硅谷-JavaWeb CSS
    1.CSS:层叠样式表单,用于(增强)控制网页样式并允许将样式信息域网页内容分离的一种标记性语言;2.CSS和HTML的组合方式:第一种:在标签的style属性上设置"key:valuevalue",......
  • JAVA丑数
    leetcode题目链接有些数的素因子只有3,5,7,请设计一个算法找出第k个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是1,3,5,7,9,15,21。......
  • 【设计模式】Java设计模式 - 命令模式
    Java设计模式-命令模式......
  • 一个五颜六色的Java 图形验证码模块
    分享一个网上找的开源的Java图形验证码项目EasyCaptcha先来个福利图看看1.简介 Java图形验证码,支持gif、中文、算术等类型,可用于JavaWeb、JavaSE等项目。2.效......
  • TE中的一种矢量图层加载方式
        在TE中加载的矢量图层,数据量过大的情况下,流方式数据显示的速度会比较慢,使用层方式加载,系统的资源占的比较多。    这里介绍一种矢量图层的加载方式,这种......
  • TE二次开发批量加载发布3dml模型
        在TE的二次开发过程中,把3dml模型用sfs或者sgs发布完成后,如何获取到sfs或者sgs上发布的模型列表,使用一定的规则对模型进行加载,灵活的控制模型图层。   下边......
  • TE二次开发加载wmts
    TE中可以通过网络服务加载地图,常用的服务有wms,wmts等,WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案。WMTS弥补了WMS不能提供分块地图的不足。WMS针对......