类加载器aa

一,关系图及各自管辖范围 (不赘述)

 

二,查看关系 

package com.jiazai;public class Main {public static void main(String[] args) {ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();//默认System.out.println(appClassLoader);ClassLoader exClassLoader = appClassLoader.getParent();System.out.println(exClassLoader);ClassLoader bootstrapClassLoader = exClassLoader.getParent();System.out.println(bootstrapClassLoader);}
}

 

为什么根加载器是空?因为是C/C++写的。

三,源码:调用过程

 

 findLoadedClass当前类加载器是否加载过这个类,当然首次加载肯定没有。

向上委托,调用parent的loadClass方法。对于appClassLoader来说,parent就是ExtClassLoader...

findClass是尝试自己加载这个类,如果说自己的管辖范围内没这个类,我没这个能力加载,那就返回调用者(向下加载)。

四,自定义类加载器

自定义类加载器需要继承java.lang.ClassLoader类,这个类有两个核心方法,一个是loadClass,这个是真正意义上双亲委派机制的实现类。是loadClass来层层委派的,而findClass就是去查找管辖范围内有没有这个类,有的话尝试加载,这个方法是一个具体加载的位置。(这是个面试题)

如果需要打破双亲委派机制,那就重写loadClass,如果是想完成自定义路径的类加载那么需要重写findClass。

示例:

public class ClassLoader_Demo {static class CJClassLoader extends ClassLoader{private String classPath;public CJClassLoader(String classPath){this.classPath = classPath;}private byte[] getBytes(String name) throws Exception {name = name.replaceAll("\\.","/");FileInputStream fileInputStream = new FileInputStream(classPath + "/" + name + ".class");int len = fileInputStream.available();byte[] data = new byte[len];fileInputStream.read(data);fileInputStream.close();return data;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {byte[] bytes = getBytes(name);return defineClass(name, bytes, 0, bytes.length);} catch (Exception e) {e.printStackTrace();throw new ClassNotFoundException();}}}public static void main(String[] args) throws ClassNotFoundException {CJClassLoader cjClassLoader = new CJClassLoader("D:\\新建文件夹");Class<?> aClass = cjClassLoader.loadClass("YangGuang");System.out.println(aClass.getClassLoader().getClass().getName());}
}

上面这串代码自定义了一个类加载器,但是只是重写了findClass,没打破双亲委派机制(仍然会走jdk loadClass那串逻辑,可以自己debug试试)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3016681.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

RAG 修炼手册|揭秘 RAG 时代的新向量数据库

随着对大型模型应用探索的深入&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generation&#xff09;受到了广泛关注&#xff0c;并被应用于各种场景&#xff0c;如知识库问答、法律顾问、学习助手、网站机器人等。 不过&#xff0c;有很多朋友对于向量数据库和…

【热门话题】实用Chrome命令:提升前端开发效率的利器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 实用Chrome命令&#xff1a;提升前端开发效率的利器引言目录1. 快速打开Chrome …

246 基于matlab的交流电机动态方程

基于matlab的交流电机动态方程&#xff0c;用于交流电机动态分析。输入电机的额定功率(kW)、电机的额定转速(r/min)、转子外径(m)、铁心长(m)转子槽数、电机极对数 等参数&#xff0c;输出转速变化、力矩变化等结果。程序已调通&#xff0c;可直接运行。 246 交流电机动态 转速…

深度强化学习框架Acme【一】

Acme学习笔记&#xff08;一&#xff09; Chapter 2 RLOnline Reinforcement LearningOffline Reinforcement LearningImitation LearningLearning from Demonstrations Chapter 3 Acme3.1 Environments and environment loops3.2 Actors3.3 Experience replay and data storag…

Backblaze发布2024 Q1硬盘故障质量报告-2

截至2024年第一季度末&#xff0c;我们正在跟踪279,572块正在运行的硬盘。硬盘型号在2024年第一季度末必须拥有500块或更多的硬盘&#xff0c;并在整个使用寿命期间累积超过100,000个硬盘工作日&#xff0c;达到这个条件的所有型号盘的故障率趋势表现如下&#xff1a; 除了三种…

后仿中必须读懂的User-defined primitives(UDP)

一 UDP定义规则 UDP&#xff0c;全名&#xff1a;User-defined primitives。 用户自己定义的原语。 UDP可分为&#xff1a;combinational UDP&#xff08;组合逻辑&#xff09;和 sequential UDP&#xff08;时序逻辑&#xff09;。 1.1 组合逻辑UDP combinational UDP用于…

02-Fortran基础--Fortran操作符与控制结构

02-Fortran基础--Fortran操作符与控制结构 0 引言1 操作符1.1 数学运算符1.2 逻辑运算符1.3 关系运算符 2 控制流程2.1 条件结构2.2 循环结构2.3 分支结构 0 引言 运算符和控制流程对编程语言是必须的,Fortran的操作符和控制流程涉及到各种数学运算符、逻辑运算符以及控制结构。…

《十九》Qt Http协议及实战

前言 本篇文章来给大家讲解QT中的Http协议&#xff0c;Http协议主要用于网络中数据的请求和响应&#xff0c;那么这篇文章将给大家讲解一下这个协议。 一、HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端…

linux 调试-kdb 调试内核-1

目标&#xff1a;打印bcm2835_spi_transfer_one 是如何从用户空间开始调用的 1. kernel 配置 KDB配置选项 添加 spi 控制器驱动 和 spi 设备驱动 2. 调试流程 调试内核-系统启动之后 1. 开发板进入kdb,等待pc 连接 rootraspberrypi:~# echo "ttyS0,115200"…

《ESP8266通信指南》12-Lua 固件烧录

往期 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发…

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么&#xff1f;基于AIGC原理以及技术更迭的思考 前言 AI&#xff0c;这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物&#xff0c;更有意思的是&#xff0c;出现频率仅次于这个词的&#xff0c;几乎都会加上一个修饰亦或是前缀——AI&#…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置&#xff0c;使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

asp.net成绩查询系统

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net成绩查询系统 学生功能有查看成绩和修改账号密码等 后台管理员可以进行用户管理 管理员添加管理员查询注…

成为黑客第一步,应该从熟练掌握运维常见的工具开始

目录 1. 开发工具 2. 自动化构建和测试 3. 持续集成与交付&#xff08;CI/CD&#xff09; 4. 部署工具 5. 维护 6. 监控&#xff0c;警告&分析 1. 开发工具 代码编辑器和IDE&#xff08;集成开发环境&#xff09;&#xff1a;如Visual Studio Code、IntelliJ IDEA和E…

看完这篇文章我奶奶都懂Opentracing了 (二)

二. 概念分析 1. Span和SpanContext 结合上述示例&#xff0c;我们从Span开始入手来进行概念分析&#xff0c;但是说在最前面&#xff0c;Span在不同的分布式链路实现中&#xff0c;其定义是不全一样的&#xff0c;尽管Opentracing已经进行了概念的统一&#xff0c;但是具体到…

QT--2

Qt界面设计 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(680,520);this->setFixedSize(680,520);this->setWindowTitle("Tim");this->setWindowFla…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

Codeforces Round 942 (Div. 2) A-D1

题目&#xff1a; Codeforces Round 942 (Div. 2) D2有缘再补吧… A. Contest Proposal 题意 两个升序&#xff08;不降&#xff09;的序列a和b&#xff0c;可以在a的任意位置插入任意数&#xff08;要保持升序&#xff09;&#xff0c;使对任意i&#xff0c;有a[i] < b[…

js 图片渐变

1. 点击图片&#xff0c;使其渐变为另一张图片 通过定义keyframes来创建一个淡入淡出的动画效果。当图片被点击时&#xff0c;先添加淡出动画使图片透明度从0渐变到1&#xff0c;然后在1秒后切换图片源并添加淡入动画使新图片透明度从0渐变到1&#xff0c;实现图片渐变效果。 …

Django调用MTP服务器给指定邮箱发送邮件

Django调用MTP服务器发送邮箱 邮箱的激活链接含有用户数据不能直接发送需要对其进行加密 发送邮箱是借助SMTP服务器进行中转 一. 配置SMTP服务中的邮箱信息以及激活链接 1. 配置邮箱权限 打开网易邮箱设置点击POP3 开启选项 注 : 在打开的过程中会弹出授权密码一点要保存 …