java中类加载与双亲委派机制详解
作者:超的博客 发布时间:2023-12-07 06:34:53
类加载是什么
把磁盘中的java文件加载到内存中的过程叫做类加载
当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. 有如下 User 类
package dc.dccmmtop;
public Class User {
public static void main(String[] args) {
System.out.println("hello");
}
}
运行 java dc.dccmmtop.User
时, 先要找到 User.Class 文件,查找全路径就是 Class_PATH + {{package name}},对于User类来说,就是 {$Class_APTH}/dc/dccmmtop.User.Class
假如 User.java
在F:\code
, 并且不在Class_PATH 下,可以通过 java -Classpath "F:\code"
临时指定。
加载类之后还有后续的步骤:
验证
准备
解析
初始化
使用
卸载
这篇文章主要来讲讲类加载
类加载器
不了解类加载机制的,可能就认为,只需找到java文件所在的磁盘位置,然后进行一次读文件的操作不就完成了加载嘛,其实远非如此。
总有一个加载类的工具,这个工具叫做类加载器,在java代码中可以通过如下方式获取当前类的类加载器是什么
package dccmmtop;
public Class User {
public static void main(String[] args) {
System.out.println("hello");
System.out.println(User.Class.getClassLoader());
}
}
如图可以看到类加载器的名字叫做 AppClassLoader
我们全局搜索一下这个类,会发现在 sun.misc.Launcher.java
文件中找到。
那么这个AppClassLoader
本身也是一个 java 文件,它又是什么时候被加载并初始化的呢?
我们滚动到文件顶部,看到 Launcher 类的构造方法部分:
标记1 和标记2 实现了一个单例模式,在5 处获取到了 AppClassLoader
实例。也就是说在某一个地方通过调用 Launcher 类中的 getLauncher()
方法,会得到 AppClassLoader
实例, 那么 getLauncher()
方法又是在哪里调用的呢?追踪到这里已经无法在java代码中找到上一步了,其实这个方法是jvm (c++实现)调用的,如下图:
来源:https://juejin.cn/post/7133102820983013390


猜你喜欢
- 1、在Hierarchy面板右键UI>Button2、创建一个空物体3、创建一个脚本 ButtonClick.cs,定义一个Click
- Android EditText的光标的显示和隐藏一、java代码1.编辑框的光标 显示的方法:editText.setCursorVisi
- 废话不多说了,下面代码给大家介绍下利用正则表达式判断字符的方法,具体代码如下所示:using System;using System.Tex
- stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,瞬
- 方案实施1、 spring和ehcache集成主要获取ehcache作为操作ehcache的对象。spring.xml中注入ehcacheM
- //计算耗时任务所需的秒数public int GetTimeSpan(DateTime dtStart, DateTime dtEnd){
- 目录LinkedHashMap 实现继承 LinkedHashMap组合 LinkedHashMap链表 + HashMap 实现LRU,即
- RecyclerView为什么会卡RecyclerView作为v7包的新控件,自从推出就广受Android Developer们欢迎,实际上
- Caffeine和Spring Boot集成Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将
- SpringBoot @ConditionalOnBean实现原理在SpringBoot1.5.X时判断条件是OR,SpringBoot2.
- 本文实例为大家分享了java * 实现在线人数统计的具体代码,供大家参考,具体内容如下1.在工程中创建监听类SessionListener
- 本文实例讲述了java采用中文方式显示时间的方法。分享给大家供大家参考。具体如下:其中t为秒,比如有时候需要计算两个任务相差多久,或者该任务
- public class User { public
- java 删除链表中的元素以下实例演示了使用 Clear() 方法来删除链表中的元素:import java.util.*;public c
- 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数例如在数组{7
- feign对象传参和普通传参及遇到的坑对象传参使用@RequestBody来指定传参对象@RequestMapping(value = &q
- swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图:并且可以设置窗体背景图片的透明度下
- public static void main(String[] args) { System.out
- Java Volatile 详解概要:Java 语言中的 Volatile 变量可以被看作是一种 “程度较轻的 synchronized”;
- Android canvas drawBitmap方法详解及实例之前自己在自定义view,用到canvas.drawBitmap