ClassLoader类加载浅析
目录
重要的结论:
JAVA中的三个classLoader及其类加载路径
类加载的双亲委派机制
重要的结论:
- ClassLoader的主要作用是通过类的全限定名如:com.yej.learning.entity.User,找到相应的class字节码内容,然后得到java运行空间内存中的Class对象;
- 不同的ClassLoader的方法 Class<?> loadClass(String name)不同,主要通过Class<?> findClass(String name)方法的不同实现;
- AppClassLoader、ExtClassLoader都是sun.misc.Launcher的内部类,bootStrap class loader加载类是native方法实现的;
- AppClassLoader的parent为ExtClassLoader,ExtClassLoader 的parent为null;
- 自己开发的类的通过AppClassLoader完成的加载;
- 类加载的双亲委派机制:一个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类加载浅析相关推荐
- 【Arthas】Arthas classloader类加载器
1.概述 转载:Arthas classloader类加载器 2.开篇 Arthas通过classloader 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls ...
- 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题.....
1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...
- 异常将上下文初始化事件发送到类的侦听器实例._Java CLassLoader类加载器详解,一点课堂(多岸学院)...
Java CLassLoader 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java ...
- 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
文章目录 一.ClassLoader 源码简介 二.BaseDexClassLoader 源码简介 三.DexClassLoader 源码简介 四.PathClassLoader 源码简介 五.InM ...
- 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )
文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...
- android classloader异常,Android中ClassLoader类加载机制
Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...
- 【深入理解JVM】ClassLoader类加载机制
Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存.ClassLoader专门负责类文件 ...
- JVM源码分析--ClassLoader类加载器
本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...
- ClassLoader类加载器
类的加载器:将class文件加载到JVM中执行这个文件. Java中将类加载器分成三类: 引导类加载器: 负责加载 JAVA_HOME/jre/lib/rt.jar 扩展类加载器: 负 ...
最新文章
- 什么原因导致芯片短路_常见的芯片故障现象
- Python进阶2——向量模拟
- 2015.1.3 让CombBox自动弹出下拉框
- mysql Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
- 【js】获得项目路径
- android简单课表,模仿大神的一个android课程表
- mysql数据库隐式表_解析MySQL隐式转换问题
- beanshell断言_从BeanShell断言脚本调用Jmeter函数
- R语言如何做NMDS分析
- unity 制作小汽车跑起来
- 爬取B站前两千位up主的粉丝数
- vnc远程控制软件下载,有哪些实用的vnc远程控制软件下载
- html让图片悬浮在网页,网页制作灰度图片悬浮效果利用HTML5和jQuery实现
- Shell脚本入门学习
- 【温故知新】—— React/Redux/React-router4基础知识独立团Demo
- 动态口令,动态密码生成(OTP)
- Windows更新后访问部分网页存在未连接到互联网的解决方案
- Android事件分发简单介绍
- 【linux】一文总结linux的环境变量
- 树莓派Bullseye系统安装QT
热门文章
- 深度神经网络模型剪枝
- [万人千题] 《C语言入门100例》(第19例) 日期——题1(C语言)(超简单)
- 快速使用rocketmq
- android迅雷面试,迅雷android面试题
- mysql decimal 类型_MySQL数据类型DECIMAL用法详解
- 【远程访问和支持软件】上海道宁为您提供简单、安全、随时可用的远程访问解决方案
- java 灰度发布_灰度发布的原理及实现
- springboot启动源码解析(三):初始化启动上下文、初始化监听器列表、发布开始启动事件
- 秋日公园--公园一角--2
- DevNet: Self-supervised Monocular Depth Learning via Density Volume Construction