类加载器classLoader

[Java安全]类加载器ClassLoader 前言 借用了先知社区的文章的一张图来解释这个原理 负责动态加载Java类到Java虚拟机的内存空间中,用于加载系统、网络或者其他来源的类文件。Java源代码通过javac编译器编译成类文件,然后JVM来执行类文件中的字节码来执行程序。 类加载器介绍 类加载器大致分为两类: JVM 默认类加载器 用户自定义类加载器 类加载器分类 引导类加载器(BootstrapClassLoader):属于jvm一部分,不继承java.lang.ClassLoader类,也没有父加载器,主要负责加载核心java库(即 阅读详情

一、类的加载、连接、初始化

(1)加载:查找并加载类的二进制数据

(2)连接

          --验证:确保被加载类的正确性

                        <1>文件的结构检查:遵从java类文件的固定格式

                        <2>语义检查:是否符合语法规范

                        <3>字节码验证:检查每个操作码是否合法,是否可被java虚拟机安全的执行。

                        <4>二进制兼容的验证:确保相互引用的类之间的协调一致。例如:不能存在引用对象的某个执行方法,抛出NoSuchMethodError错误。

          --准备:为类的静态变量分配内存,并将其初始化为默认的值

          --解析:把类中的符号引用转换为直接引用

(3)初始化:为类的静态变量赋予正确的初始值

                                

package classLoader;

class SingleTon {
	private static SingleTon singleTon = new SingleTon();
	public static int counter1;
	/* class文件加载的步骤:(1)加载;(2)连接(验证、准备、解析);(3)初始化 */
	/* counter2在连接->准备阶段被赋予默认初始值0,在初始化阶段被赋予=等号右边的0值*/
	public static int counter2 = 0;
	// private static SingleTon singleTon = new SingleTon();

	private SingleTon() {
		counter1++;
		counter2++;
	}

	public static SingleTon getInstance() {
		return singleTon;
	}
}

public class Test1 {
	public static void main(String[] args) {
		SingleTon singleTon = SingleTon.getInstance();
		/*
		 * 类的加载:将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区中,然后在堆区中创建一个java.lang.Class对象
		 * ,用来封装类在方法区内的数据结构
		 */
		singleTon.getClass();
		singleTon.getClass().getClassLoader();
		System.out.println("counter1 = " + SingleTon.counter1);
		System.out.println("counter2 = " + SingleTon.counter2);
	}
}
执行结果:打印:

counter1 = 1
counter2 = 0

counter2在连接->准备阶段被赋予默认初始值0,在初始化阶段被赋予=等号右边的0值

二、主动使用、被动使用

java程序对类的使用分为主动使用和被动使用。

每个类或接口被java程序“首次主动使用”是才会被java虚拟机初始化。

主动使用(六种)

(1)创建类的实例

(2)访问某个类或接口的静态变量,或对静态变量赋值。

(3)调用类的静态方法

(4)反射;Class.forName

(5)初始化一个类的子类

(6)java虚拟机启动时被标明为启动的类

除了以上六种情况,都叫被动使用,都不会导致类的初始化。

三、类的加载

指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区中内,然后在堆区创建一个java.lang.Class的对象,用来封装类在方法区内的数据结构。

         

四、类加载器

两种类加载器:

(1)java虚拟机自带的加载器

        <1>根加载器:没有父加载器;负责加载核心类库,如java.lang等。从系统属性sun.boot.class.path所指定的目录中加载类库。依赖于底层操作系统,不继承与ClassLoader

        <2>扩展类加载器:其父加载器为根加载器。从java.ext.dirs系统属性中所指路径加载类库(jre/lib/ext)。java.lang.ClassLoader的子类

        <3>系统类加载器:也称应用类加载器,父加载器为扩展类加载器。从环境变量classpath目录中加载

System.out.println(System.getProperty("sun.boot.class.path"));
System.out.println(System.getProperty("java.ext.dirs"));

(2)用户自定义的类加载器

java.lang.ClassLoader的子类

                     


 


       父委托机制的优点是:提高系统的安全性。因为在该机制下:用户自定义的类加载器不可能加载应该由该父加载器可加载的可靠的类。


      每个类加载器都有自己的命名空间,命名空间由该类加载器及所有父加载器所加载的的类组成。在同一个命名空间中,不会出现包名类名完全一样的类;在不同的命名空间中可以出现。


五、自定义类加载器

MyClassLoader.java

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class MyClassLoader extends ClassLoader {

	/** 类加载器的名字 */
	private String name;
	private String path = "D:\\";
	private final String fileType = ".class";

	public MyClassLoader(String name) {
		/* 让系统类加载器成为该类的父加载器 */
		super();
		this.name = name;
	}

	public MyClassLoader(ClassLoader parent, String name) {
		/* 显式的指定该类加载器的父加载器 */
		super(parent);
	}

	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] data = loadClassData(name);
		return this.defineClass(name, data, 0, data.length);
	}

	private byte[] loadClassData(String name) {
		InputStream is = null;
		byte[] data = null;
		ByteArrayOutputStream baos = null;
		try {
//			this.name = this.name.replace(".", "\\");
			is = new FileInputStream(new File(path + name + fileType));
			baos = new ByteArrayOutputStream();
			int ch = 0;
			while (-1 != (ch = is.read())) {
				baos.write(ch);
			}
			data = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null)
					is.close();
				if (baos != null)
					baos.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return data;
	}

	@Override
	public String toString() {
		return name;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public static void main(String[] args) throws Exception {
		MyClassLoader loader1 = new MyClassLoader("loader1");
		loader1.setPath("H:\\develop\\workspace\\learn_workspace\\classLoader\\class\\serverlib\\");
		MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
		loader2.setPath("H:\\develop\\workspace\\learn_workspace\\classLoader\\class\\clientlib\\");
		MyClassLoader loader3 = new MyClassLoader("loader3");
		loader3.setPath("H:\\develop\\workspace\\learn_workspace\\classLoader\\class\\otherlib\\");
		test(loader1);
		System.out.println("######");
		test(loader2);
		System.out.println("######");
		test(loader3);
	}

	public static void test(ClassLoader loader) throws Exception {
		Class clazz = loader.loadClass("Sample");
		Object obj = clazz.newInstance();
	}
}

Sample.java

public class Sample {

	public int v1 = 1;

	public Sample() {
		System.out.println("Sample is loader by :"
				+ this.getClass().getClassLoader());
		new Dog();
	}
}

Dog.java

public class Dog {
	public Dog() {
		System.out.println("Dog is loaded by :"
				+ this.getClass().getClassLoader());
	}
}

为了避免eclipse中对环境变量的影响,在cmd中执行。

编译后的文件class文件,测试时放置的路径结构:

               

cmd中执行结果:

           

sun.misc.Launcher@AppClassLoader@........代表在”系统/应用类加载器“中加载的。

皮毛笔记整理,待深入

classloader命令:查看类加载器信息(代码示例) 本文介绍了使用Arthas的classloader命令查看Java类加载器信息的方法。通过一个简单的Java代码示例,演示了如何编译运行程序并使用Arthas连接进程。文章详细解读了classloader命令输出的类加载器类型(Bootstrap、Extension、System及自定义加载器)、加载类数量和哈希码等信息,并针对可能出现的输出不准确问题,提供了解决缓存、权限和版本兼容性等问题的方案。最后指出下一步将学习Arthas的字节码诊断功能,完善类加载与字节码诊断知识体系。 阅读详情

相关推荐

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

Java的类加载器(ClassLoader)

虽然Java提供了多种内置类加载器,但在某些场景中(如模块化系统、插件系统等),我们可能需要自定义类加载器来加载特定位置的类或JAR文件。自定义类加载器通过继承并覆盖方法来实现。// 自定义类加载器,从指定路径加载类 private String classPath;} // 读取类文件并转换为字节数组 private byte [ ] loadClassData(String className) {int len;} }

Flying_Fish_roe的博客 2758

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 507

java类加载器ClassLoader

1.ClassLoader介绍 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现. 类加载器是一个用来加载类文件的类...

CsbLanca 300

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置

本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。

weixin_29031057的博客 1335

Java类加载器 ClassLoader的解析

Java类加载器 ClassLoader的解析

xinyuan的专栏 3736

基于单片机的宠物狗智能项圈设计

GPS定位功能:利用GPS模块实时获取宠物的位置,帮助主人追踪宠物的活动轨迹。活动监测:使用加速度传感器监测宠物的活动情况,如运动、休息等,并进行分析。健康监测:集成心率传感器,实时监控宠物的心率,以确保其健康。声音识别功能:通过麦克风捕捉宠物的叫声,检测宠物的状态(如饥饿、疼痛等)。蓝牙/Wi-Fi通信:通过蓝牙或Wi-Fi模块与手机APP或云端平台进行数据交互,实时反馈宠物的状态信息。电池管理:实现低功耗设计,确保设备的续航能力。

2201_76125393的博客 2281

ClassLoader类加载器

public abstract class ClassLoader {} A class loader is an object that is responsible for loading classes. The class ClassLoader is an abstract class. 一个类加载器是什么?顾名思义,是一个用来加载类的对象。ClassLoader 是一个抽象类。 Given the binary name of a class, a class loader should

rgbhi的博客 324

[工作流节点10] 获取多条数据并循环执行 —— 明道云批处理自动化实战

本文系统介绍了明道云工作流中"获取多条数据+循环执行"的批处理功能。该功能通过筛选数据集合并逐条处理,适用于批量通知、数据更新等场景。文章详细解析了功能配置方法,包括数据筛选、循环设置和异常处理,并提供了合同到期提醒等典型应用案例。同时强调了数据量控制、分批处理、错误处理等优化策略,帮助用户实现高效批量自动化。这一功能组合能将业务从单条处理升级为批量驱动,显著提升工作效率。

每日出拳老爷子的博客 455

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2979

自定义一个类加载器ClassLoader

自定义一个类加载器ClassLoader jvm中除了根类加载器(BootstrapClassLoader)之外的所有类加载器都是继承ClassLoader实现的; ClassLoader类中的关键方法: Class loadClass(String name,boolean resolve):此方法时ClassLoader的入口点,根据指定名称来加载类,系统就是调用ClassLoader的该方...

蒋蒋 405

OpenCV计算机视觉实战(11)——边缘检测详解

在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。

qq_30167691的博客 4375

URL ClassLoader 类加载器

URL ClassLoader 是 Java 用来加载远程类的类加载器。在 flink 中,启动时使用 -C 参数可以向集群中所有节点上的每个用户代码类加载器添加一个URL,这依靠的就是 URL ClassLoader 。ClassLoader 只能加载 classpath 下面的类,而 URL ClassLoader 可以加载任意路径下的类。它继承自 SecureClassLoader,SecureClassLoader 继承自 ClassLoader 。 URL ClassLoader 可以从下面三个方

BugAngel的博客 1001

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

类加载器ClassLoader详解

类加载器ClassLoader详解

勇心在馨 8278

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

类加载器ClassLoader

上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是将编译过后的Class文件加载到内存中。 需要注意的是,即使是同一个类,类加载器不一样,就必定不相等。 例如自定义了一个类加载器跟JVM默认加载器进行比对 /** *自定义类加载器 */class MyClassLoader extends ClassLoader { //类加载需要用到包名.

weixin_37337210的博客 431

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【JAVA】类加载器(ClassLoader)

类加载器(ClassLoader)

weixin_37559642的博客 964

Java类加载器ClassLoader的说明

(1)API文档内容如下:类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。 每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。 数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创

徐刘根的博客 3119

Java类加载器ClassLoader总结

JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.forname()等方法,显式加载需要的类 类加载的动态性体现: 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是

m0_67659981的博客 495

深入理解JVM中的ClassLoader类加载器

文章目录深入理解JVM中的ClassLoader类加载器JVM的体系结构图JVM的位置JVM结构图中的class files文件JVM结构图中的类加载器ClassLoader的解释类加载器ClassLoader的作用类加载器的种类java类的加载机制双亲委派机制沙箱安全机制 深入理解JVM中的ClassLoader类加载器 JVM的体系结构图 先来看一下JVM的体系结构,如下图: JVM的位置 JVM的位置,如下图: JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN(

xzy的博客 3150

Java类加载器 — classloader 的原理及应用

本文对classloader的加载过程和加载原理进行了介绍,并结合类加载机制的特征,介绍了其相应的使用场景。由于篇幅限制,并没有对每种场景的具体实现细节进行介绍,而只是阐述了其基本实现思路。或许大家觉得classloader的应用有些复杂,但事实上只要大家对class从哪里加载,搞清楚loadClass的机制,就已经成功了一大半。正所谓万变不离其宗,抓住了本质,其它问题也就迎刃而解了。✿。

2401_84048586的博客 1419

【Arthas】Arthas classloader类加载器

1.概述 转载:Arthas classloader类加载器 2.开篇 Arthas通过classloader 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。可以让指定的classloader去getResources,打印出所有查找到的resources的url。对于ResourceNotFoundException比较有用。 Arthas的classloader的查找本质也是通过Instrumentation获取所有的加载的class,然后通过class的.

九师兄 1945

Java虚拟机学习 - 类加载器(ClassLoader)

类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 Java 字节码文件(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每一个这样的实例用来表示一个 Java 类。实际的情况可

天行健,君子以自强不息 1万+
上一篇: jdom 简单示例
下一篇: Java加密与解密的艺术 笔记一
eg366
博客等级 码龄19年 5粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值