目录

重要的结论:

JAVA中的三个classLoader及其类加载路径

类加载的双亲委派机制


重要的结论:

  1. ClassLoader的主要作用是通过类的全限定名如:com.yej.learning.entity.User,找到相应的class字节码内容,然后得到java运行空间内存中的Class对象;
  2. 不同的ClassLoader的方法 Class<?> loadClass(String name)不同,主要通过Class<?> findClass(String name)方法的不同实现;
  3. AppClassLoader、ExtClassLoader都是sun.misc.Launcher的内部类,bootStrap class loader加载类是native方法实现的;
  4. AppClassLoader的parent为ExtClassLoader,ExtClassLoader 的parent为null;
  5. 自己开发的类的通过AppClassLoader完成的加载;
  6. 类加载的双亲委派机制:一个ClassLoader收到loadClass请求时总是先调用parent进行类加载,parent无法完成类加载时再调用bootStrap class loader进行类加载,当parent和bootStrap class loader都无法完成类加载时自己才进行类加载。

JAVA中的三个classLoader及其类加载路径

获取各个类加载器的加载路径源码:

package com.yej.learning;import sun.misc.Launcher;import java.net.URL;
import java.net.URLClassLoader;public class ClassLoaderLoadPath {public static void main(String[] args) {System.out.println("BootstrapClassLoader 的加载路径: ");URL[] urls = Launcher.getBootstrapClassPath().getURLs();for (URL url : urls) {System.out.println(url);}System.out.println("----------------------------");//获得ExtClassLoaderURLClassLoader extClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader().getParent();System.out.println(extClassLoader);System.out.println("ExtClassLoader 的加载路径: ");URL[] extUrls = extClassLoader.getURLs();for (URL url : extUrls) {System.out.println(url);}System.out.println("----------------------------");//获得AppClassLoaderURLClassLoader appClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();System.out.println(appClassLoader);System.out.println("AppClassLoader 的加载路径: ");URL[] appUrls = appClassLoader.getURLs();for (URL url : appUrls) {System.out.println(url);}System.out.println("----------------------------");}
}

执行结果:

类加载的双亲委派机制

一个ClassLoader收到loadClass请求时总是先调用parent进行类加载,parent无法完成类加载时再调用bootStrap class loader进行类加载,当parent和bootStrap class loader都无法完成类加载时自己才进行类加载。

类加载源码分析

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {/*****parent不为空时调用parent进行类加载**/c = parent.loadClass(name, false);} else {/*****parent为空时调用bootStrap class loader进行类加载**/c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();/*****当parent和bootStrap class loader都无法完成类加载时才自己尝试进行类加载**/c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

ClassLoader类加载浅析相关推荐

  1. 【Arthas】Arthas classloader类加载器

    1.概述 转载:Arthas classloader类加载器 2.开篇 Arthas通过classloader 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls ...

  2. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题.....

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

  3. 异常将上下文初始化事件发送到类的侦听器实例._Java CLassLoader类加载器详解,一点课堂(多岸学院)...

    Java CLassLoader 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java ...

  4. 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

    文章目录 一.ClassLoader 源码简介 二.BaseDexClassLoader 源码简介 三.DexClassLoader 源码简介 四.PathClassLoader 源码简介 五.InM ...

  5. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...

  6. android classloader异常,Android中ClassLoader类加载机制

    Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...

  7. 【深入理解JVM】ClassLoader类加载机制

    Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存.ClassLoader专门负责类文件 ...

  8. JVM源码分析--ClassLoader类加载器

    本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...

  9. ClassLoader类加载器

    类的加载器:将class文件加载到JVM中执行这个文件. Java中将类加载器分成三类: 引导类加载器:     负责加载 JAVA_HOME/jre/lib/rt.jar 扩展类加载器:     负 ...

最新文章

  1. 什么原因导致芯片短路_常见的芯片故障现象
  2. Python进阶2——向量模拟
  3. 2015.1.3 让CombBox自动弹出下拉框
  4. mysql Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
  5. 【js】获得项目路径
  6. android简单课表,模仿大神的一个android课程表
  7. mysql数据库隐式表_解析MySQL隐式转换问题
  8. beanshell断言_从BeanShell断言脚本调用Jmeter函数
  9. R语言如何做NMDS分析
  10. unity 制作小汽车跑起来
  11. 爬取B站前两千位up主的粉丝数
  12. vnc远程控制软件下载,有哪些实用的vnc远程控制软件下载
  13. html让图片悬浮在网页,网页制作灰度图片悬浮效果利用HTML5和jQuery实现
  14. Shell脚本入门学习
  15. 【温故知新】—— React/Redux/React-router4基础知识独立团Demo
  16. 动态口令,动态密码生成(OTP)
  17. Windows更新后访问部分网页存在未连接到互联网的解决方案
  18. Android事件分发简单介绍
  19. 【linux】一文总结linux的环境变量
  20. 树莓派Bullseye系统安装QT

热门文章

  1. 深度神经网络模型剪枝
  2. [万人千题] 《C语言入门100例》(第19例) 日期——题1(C语言)(超简单)
  3. 快速使用rocketmq
  4. android迅雷面试,迅雷android面试题
  5. mysql decimal 类型_MySQL数据类型DECIMAL用法详解
  6. 【远程访问和支持软件】上海道宁为您提供简单、安全、随时可用的远程访问解决方案
  7. java 灰度发布_灰度发布的原理及实现
  8. springboot启动源码解析(三):初始化启动上下文、初始化监听器列表、发布开始启动事件
  9. 秋日公园--公园一角--2
  10. DevNet: Self-supervised Monocular Depth Learning via Density Volume Construction