Java类加载器及其委托机制

三. zemax光学设计流程+案例 文章目录zemax 基本操作:1. 建立光学基本模型2. 像质评价3. 优化(重点)4. 公差分析简单镜头设计 zemax 基本操作: 1. 建立光学基本模型 2. 像质评价 3. 优化(重点) 对系统设定的约束条件或目标值 统称为操作数。 操作数: 光学特性参数(焦距EFFL,近轴放大率PMAG,入瞳位置EMPP) 像差参数(球差SPHA,彗差COMA,像散ASTI) 边界条件(中心厚度值CTVA,边缘厚度值ETAV) 优化的主要步骤: 设置评价函数和优化操作数 一般小像差系统采用波像差 构建 阅读详情
概要:
简单的说,类加载器就是JVM用来把类加载到内存中的工具。

类加载器本质上也是Java类,所以,类加载器本身也需要被JVM来加载,那么谁来加载这些类加载器呢?在JVM中,系统默认有三个类加载器:BootStrap, ExtClassLoader, AppClassLoader。其中BootStrap是采用C++编写的一段二进制代码,它嵌套在JVM内核中,当JVM启动时,这个类就会被启动,JVM用它来加载其它的类加载器。

一、类加载器加载类的过程:

Java程序运行的场所是内存,在命令行下执行:
Javac  ClassLoaderTest.java   将java文件编译成.class文件
Java   ClassLoaderTest       JVM会将ClassLoaderTest.class加载到内存中,并形成一个Class的对象ClassLoaderTest.class。

其中的过程就是类加载过程:
1、寻找jre目录,寻找jvm.dll,并初始化JVM;
2、产生一个Bootstrap Loader(启动类加载器);
3、BootstrapLoader自动加载ExtClassLoader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
4、BootstrapLoader自动加载AppClassLoader(系统类加载器),并将其父Loader设为ExtClassLoader。
5、最后由AppClassLoader加载ClassLoaderTest类。

以上就是类加载的最一般的过程。

二、类加载器的运行委托机制

委托机制:
1、运行一个程序时,总是由AppClassLoader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
3、BootstrapLoader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
4、如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
5、当所有父类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器的子类加载器

看下面一段代码:

package com.cndqe.test;

public class ClassLoaderTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ClassLoader loader = ClassLoaderTest.class.getClassLoader();
		while(loader != null){
			System.out.println(loader.getClass().getName());
			loader = loader.getParent();
		}
		System.out.println(loader);
	}

}

运行结果:

sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

从上面的结果可以看出,AppClassLoader加载当前线程的类,而AppClassLoader的父加载器是ExtClassLoader,而ExtClassLoader的父类加载器是BootStrap,打印null的原因是Bootstrap(启动类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null


三、类加载器之间的父子关系和管辖范围:

Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或者默认采用系统类加载器为其父级类加载。

BootStrap -> ExtClassLoader -> AppClassLoader(即通常所说的System ClassLoader)

它们的管辖范围依次是:
  BootStrap------>JRE/lib/rt.jar
  ExtClassLoader---------->JRE/lib/ext/*.jar
  AppClassLoader---------->CLASSPATH指定的所有jar或目录。


四、类加载的三种方式

1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载

五、自定义类加载器

1.自定义的类加载器必须继承ClassLoader(抽象类),并且重写findClass()方法;(除了Bootstrap以外,所有的类加载器都要继承ClassLoader)
2.调用继承自ClassLoader的方法 loadClass(String name),此方法返回一个name对应的Class对象。在loadClass()内部执行过程中,loadClass()方法内部采用委托机制,向父加载器上交任务,当父加载器找不到资源时,loadClass()内部会调用自定义类加载器所重写的findClass()方法。

3.将要加载的类读取成二进制数据的byte数组

4.defineClass(String name, byte[ ] , int  off,  int  len);功能:将一个byte数组转换成一个Class类的实例

自定义一个类加载器MyClassLoader,加载类Test,代码如下:

图为测试项目架构图:

Test.class是Test.java编译后的class文件,测试期间,为了让我们自定义的类加载器加载Test.java这个,我们写一个不带包名的Test.java编译后,在项目根目录下新建一个文件夹,存放编译后的Test.class文件

代码:

package com.classloader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

public class MyClassLoader extends ClassLoader {
	private String name;
	private String path = "E:\\gaotong\\workspace\\test\\testlib\\";

	public MyClassLoader(String name) {
		this.name = name;
	}

	public MyClassLoader(ClassLoader parent, String name) {
		super(parent);
		this.name = name;
	}

	/**
	 * 重写findClass()方法
	 */
	@Override
	public Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] data = loadClassData(name);
		return this.defineClass(name, data, 0, data.length);
	}

	public byte[] loadClassData(String name) {
		InputStream is = null;
		ByteArrayOutputStream os = null;
		try {
			name = name.replace(".", "//");
			is = new FileInputStream(new File(path + name + ".class"));
			os = new ByteArrayOutputStream();
			int i = 0;
			while ((i = is.read()) != -1) {
				os.write(i);
			}
			return os.toByteArray();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null) {
					is.close();
				}
				if (os != null) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return null;
	}

	/**
	 * @param args
	 * @throws ClassNotFoundException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException {
		MyClassLoader loader = new MyClassLoader("myClassLoader");
		Class<?> clazz = loader.loadClass("Test");
		Date tt = (Date) clazz.newInstance();
		System.out.println(tt.toString());
		
		
		ClassLoader loader2 = tt.getClass().getClassLoader();
		while(loader2 != null){
			System.out.println(loader2.getClass().getName());
			loader2 = loader2.getParent();
		}
		

	}

}
	

import java.util.Date;

public class Test extends Date{

	@Override
	public String toString() {
		return "Hello,I am Test!";
	}
	
}


运行结果 :


Hello,I am Test!
com.classloader.MyClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

六、Java WebProject下的类加载器加载过程

Tomcat自定义了一些类加载器,当Tomcat启动时,会自动把Tomcat定义的类加载器加入到JVM中,在Servlet中加载Classpath下的类,一般情况下,类加载器的委托顺序:

org.apache.catalina.loader.WebappClassLoader

org.apache.catalina.loader.StandardClassLoader

org.apache.Launcher$AppClassLoader

org.apache.Launcher$ExtClassLoader

null

参考资料1:http://hi.baidu.com/sonmeika/item/3323651fa2c722f865eabf17

参考资料2:http://hi.baidu.com/sonmeika/item/3323651fa2c722f865eabf17

大数据领域存算分离:教育行业的数据应用探索 在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表; 阅读详情

相关推荐

Matlab系列之GUI设计基础

Matlab系列之GUI设计基础简介编辑界面菜单设计控件设计控件描述个人理解Matlab转译控件属性【1】外观与行为【2】控件对象的信息【3】回调函数【4】状态信息结束结束更多精彩,等你发现~ 简介 GUI即图形用户界面(Graphical User Interface),人机交互的一种方式,可以简化用户的操作,比如只需要点点窗口上的按键或者菜单选择等等,就可以实现一个复杂的功能,有点类似黑盒的操作吧。 本篇将主要介绍GUI的使用,以及一些功能,后续的篇章再使用GUI来设计实例。 打开GUI可以在Matla

Smart_Devil的博客 5万+

Java类加载过程详解

类的生命周期类的加载类加载过程加载链接验证准备解析初始化总结 首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1): 再详细具体一点(图2): 上面的图片有些地方看不懂没关系,先在脑子里大体有个印象。 我们这篇文章讲的是类的加载过程,所以在讲类加载之前先要知道类的生命周期是一个怎样的过程。 如下图所示(图3): 类的生命周期一共有5个阶段,分别是: 1.加载(Loading) 2.链接(Linking) 3.初始化(Initialization) 4.使用(Using) 5.卸载(U

fascinate_的博客 3642

Spring Boot 3.2 集成 Shiro 2.0.1 踩坑实录:从 javax.servlet 到 jakarta.servlet 的完整迁移指南

本文详细介绍了Spring Boot 3.2集成Shiro 2.0.1时遇到的从javax.servlet到jakarta.servlet的迁移问题,提供了完整的解决方案和迁移指南。通过Maven依赖配置和代码调整,帮助开发者顺利跨越Jakarta EE的兼容性鸿沟,确保Shiro权限控制在Spring Boot 3.2环境中正常运行。

weixin_42570296的博客 485

类加载过程是怎样的?

典型回答 一般来说,我们把Java的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java虚拟机规范里有非常详细的定义。 加载阶段(Loading):它是Java将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构(Class对象)。这里的数据源可能是各种各样的形态,如jar文件、class文件,甚至是网络数据源等。如果输入数据不是ClassFile的结构,则会抛...

qweqwruio的博客 1万+

莆田市C++专项选拔第一轮题4

现在小明同学想要从两堆硬币中各选择一枚硬币,使得两枚硬币的面值之和 不超过 k。不同的硬币组合,就算面值相同,也视为不同的方案。现在他把这些硬币分成了两堆,已知两堆硬币分别有 n 和 m 枚硬币。可选方案有: (1,2), (1,1), (1,1), (5,2), (5,1), (5,1),共 6 种。第一行三个整数 n, m, k,分别表示第一堆硬币的数量,第二堆硬币的数量,以及面值之和的上限。对于30%的数据,1 ≤ n , m ≤ 1000 , 1 ≤ b , c ≤ 1000。

lpstudio的博客 925

PIN限幅二极管在接收机中的应用

本文介绍了接收机保护限幅器的工作原理及应用,重点阐述了PIN二极管在雷达收发机中的关键作用。文章指出,限幅器能有效保护接收机灵敏元件免受大功率信号损害,主要通过反射而非耗散功率来实现保护功能。文章详细分析了PIN二极管的层结构特性及其阻抗变化机制,解释了多级限幅器的设计原理(包括清理级和粗限幅器的配合使用),并介绍了通过添加检波二极管降低阈值水平的方法。最后指出,实际应用中限幅器通常采用3级或更少的设计。

weixin_49761275的博客 2378

类加载的过程是怎样的?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 JVM加载java类就是将字节流(如.class文件,网络传输的字节流)文件加入到内存中的过程,分为以下三步:加载、链接、初始化 1. 加载是指查找字节流,并且据此创建类的过程。 加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器

Shockang的博客 1万+

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 630

类加载器和委托机制的理解

Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。 Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化

阿送 864

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

Swin Transformer 与 CNN 结合实现图像分类

Swin Transformer 与 CNN 结合实现图像分类。(含swin transformer 结构讲解,cnn网络搭建,代码)

这里是Mae。 5027

java双亲委派机制,类加载器详解

java双亲委派机制,类加载器到分类以及作用,自定义的类名和包名与系统自带的类名重复了会发生什么

ocean&21的博客 1255

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

类加载器的委托机制

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。中文叫做类加载器。 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassL

学习笔记 5315

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

黑马程序员--05.类加载器--04【应用程序默认类加载器】【验证类加载器委托机制】

类加载器--4 应用程序默认类加载器 验证类加载器委托机制 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 1.    应用程序的默认类加载器 前面的日志主要阐述了某一个类加载器如何进行对指定类的加载。现在就要讨论一下当JVM真正执行用户的应用程序代码的时候,到底从哪一个类加载器开始对指定的类进行加载的。 1)

歆明正航的专栏 1006

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM笔记7:类加载器与上级委托机制

Java中的类加载器主要有2类,一类是系统提供的,包括:启动类加载器、扩展类加载器和应用程序类加载器;另一类是由Java应用开发人员编写的自定义类加载器。启动类加载器属于JVM内部使用的类加载器,既没有上级类加载器,也没有下级类加载器,应用程序类加载器的上级是扩展类加载器,自定义类加载器的上级是应用程序类加载器。如果一个类加载器收到了加载类的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给上级类加载器去完成,只有当上级类加载器反馈自己无法完成这个加载请求时,下级类加载器才会去尝试自己加载这个类,这

怀揣梦想,努力前行 3230

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

黑马程序员-高新技术-类加载器和委托

------- android培训、java培训、期待与您交流! ---------- 44    类加载器及其委托机制的深入分析 1.类加载器  Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器(BootStrap,ExtClassLoader,AppClassLoader),每个类加载器负责加载特定位置的类.除了BootStrap以外的类

vicwing的专栏 469

java类加载器以及ClassNotFoundException异常

Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的 类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不 是不是java类,这正是BootStrap(因为它是由C++写成的,在

Android探索之路 2063

JVM中类加载器的父委托机制

类加载器   类加载器用来把类加载到Java虚拟机中。   类加载器的类型   有两种类型的类加载器:   1.JVM自带的加载器:     根类加载器(Bootstrap)     扩展类加载器(Extension)     系统类加载器(System)   2.用户自定义的类加载器:     java.lang.ClassLoader的子类,用户可以定制

乐在克里特的博客 276

JVM 类加载器介绍及其父亲委托机制 Parent Delegation

1、类加载器: 类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好的保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器之外,其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类是,loader1类首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器

DViewer的专栏 856

JVM 类加载器介绍及其双亲委托机制

1、类加载器: 类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好的保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器之外,其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类是,loader1类首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器完成

x_i_y_u_e的专栏 1385

Java的类加载器

之前在一次面试中有被问道类加载器的问题,当时没答出来。今天既然看到张老师讲类加载器的视频,就写一篇笔记吧。 1.类加载器及其委托机制的深入分析: Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类加载器负责加载特定位置的类: BootStrap , ExtClassLoader , AppClassLoader。 类加载器也是Java类,因为其他是java类的类加载器本

mxlxiao7的专栏 822

jvm类加载器的父类委托机制

1. 两种类型的类加载器: (1) JVM自带的加载器 - 根类加载器(Bootstrap) 使用C++编写,程序员无法在Java代码中获得该类 - 扩展类加载器(Extension) 使用Java代码实现 - 系统类加载器(System - 应用类加载器) 使用Java代码实现 (2) 用户自定义的类加载器 - java.lang.ClassLoader的子类 - 用户可以

技术人生 4315

java类加载器

1,什么是类加载器?         加载类的工具.   2,类加载器有什么作用?         当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 类加载器也是Java类   3,类加载器之间的父子关系和管辖范围.         ClassLoader classLoader = ClassLoaderTest.class.getC

朱智文的专栏 378
上一篇: JavaScript_Location对象
下一篇: JackSon学习笔记(二)
java_huashan
博客等级 码龄14年 37粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值