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
猜你喜欢
- 前言我们在日常的开发过程中针对一些字段采用整型的方式去代替某些具体的含义,比如性别0代表男,1代表女。如果只是一些不会变更的转译我们可以采用
- 前言我们都知道,kill在linux系统中是用于杀死进程。kill pid [..]kill命令可将指定的信号发送给相应的进程或工作。 ki
- 数组实现Java 自定义Queue队列及应用Java 自定义队列Queue:队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能
- 本文实例为大家分享了Java实现打字游戏的具体代码,供大家参考,具体内容如下新建一个项目,然后在src里面建一个MyGame.java文件,
- 接收 / 返回文本消息①接收/返回文本消息原理说明当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的UR
- 问题介绍:用二维数组表示一个迷宫,设置迷宫起点和终点,输出迷宫中的一条通路实现思路:二维数组表示迷宫:0表示路且未走过、1表示墙、2表示通路
- idea删除模块后重新创建显示该模块已经被注册原因:注册信息没有删除干净解决方案:找到gradle.xml,modules.xml,work
- 一、DES加密和解密package com.itjh.javaUtil;import java.io.UnsupportedEncoding
- string fileExt = Path.GetExtension(excelPath);string conn = "&quo
- 那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
- 题主要区分清楚内码(internal encoding)和外码(external encoding)就好了。内码是程序内部使用的字符编码,特
- 本文实例为大家分享了unity实现鼠标跟随的具体代码,供大家参考,具体内容如下需求:当鼠标放到cube上,然后移开鼠标cube会跟随鼠标移动
- 可以指定编码如:utf-8来写入和读取文件。如果文件编码未知,可以通过该方法先得到文件的编码后再指定正确的编码来读取,否则会出现文件乱码问题
- 1. 实现原理将key映射到 2^32 - 1 的空间中,将这个数字的首尾相连,形成一个环计算节点(使用节点名称、编号、IP地址)的hash
- 1.两种取值方式的差异mapper.xml映射文件<select id="selectEmployeeByCondition
- 一、 WillPopScope用法WillPopScope本质是一个widget用于拦截物理按键返回事件(Android的物理返回键和iOS
- 通过yml配置文件为静态成员变量赋值我们对springboot为普通成员变量的方式很熟悉,所以经常定式思维的认为静态属性的赋值和普通属性一样
- 前言:Java异常处理的五个关键字:try、catch、finally、throw、throws抛出异常throw在编写程序时,我们必须要考
- 什么是二叉堆二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。在二叉树建树时采取前序建树就是建立的完全二叉树。也就是二叉堆。所以二叉堆
- 剪贴板是Windows操作系统中最常用的功能之一,它用来从一个应用程序向另一个应用程序传递数据,可以是文本,图象,甚至是程序对象。不过剪贴板