七、类加载器

类加载机制(七):线程上下文类加载器 title: 类加载机制(七):线程上下文类加载器 date: 2019-03-21 20:14:06 categories: Java虚拟机 tags: 类加载机制 线程上下文类加载器 双亲委托机制的破坏 我们知道,class文件的加载是按照双亲委托机制完成的,这个机制解决了各个类加载器的基础类的统一问题,因为上层类加载器加载的类对下层加载的类是可见的,所以这些基础类可以被Java程序所... 阅读详情

1.概念

     类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。

2.使用类加载器获取类对象

3.查看类对象的类加载器

4.类加载器的类型

   <1>应用类加载器App:加载自己写的类或者jar包下面的类
   <2>扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包
   <3>根类加载器null:加载jdk/jre/lib/jar(所有类加载器的父加载器)

     首先要写一个Person实体类,以下是测试类

package com.zking.test;

import org.junit.Test;


/**
 * 测试包
 * 类加载器
 */
public class TestClassLoader {
	 /**
	  * 以前new一个对象
	  */
	   @Test
	   public void test1(){
		      Person person=new Person();
		      person.setPname("张三");//设值
	          System.out.println(person.getPname());//打印
	   }
	   
	   /**
	    * 通过类加载器获取对象
	    */
	   @Test
	   public void test2(){
		      try {
		    	  //获取类对象
		    	  Class clazz=Class.forName("com.zking.entity.Person");
		    	  //通过类对象直接拿
		    	  Person per=(Person)clazz.newInstance();
 	              per.setPname("李四");
		          System.out.println(per.getPname());
		    	  
			      //获取类加载器
		    	  ClassLoader cl=clazz.getClassLoader();
		    	  //查询该类加载器的类型(应用类加载器App:加载自己写的类或者jar包下面的类App)
		          System.out.println(cl);//打印:sun.misc.Launcher$AppClassLoader@6b97fd
		    	  
		          //获取 超类的 类加载器
		          //ClassLoader clParent=clazz.getSuperclass().getClassLoader();
		          //System.out.println(clParent);//打印超类:
		    	  ClassLoader clParent=cl.getParent();//扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包
		    	  System.out.println(clParent);//打印:sun.misc.Launcher$ExtClassLoader@1c78e57
		    	  
		    	  //
		    	  ClassLoader clGrandParent=clParent.getParent();
		    	  System.out.println(clGrandParent);
		    	  
		      } catch (Exception e) {
			      // TODO Auto-generated catch block
			      e.printStackTrace();
	           }
	   }
	   
}


5.自定义类加载器

package com.zking.diy;

import java.io.FileInputStream;

/**
 * 自定义类加载器:自己写一个类继承人家的类,再改一改
 */
public class ClassLoaderDIY extends ClassLoader{
	
//重写方法:findClass+Alt+/
		@Override
		protected Class<?> findClass(String name) throws ClassNotFoundException {
			    System.out.println("自定义类加载器");//测试语句
			    System.out.println(name);
			    name=name.replaceAll("\\.", "/");//所有的.替换成\
			    System.out.println("替换后:"+name);
			    
			    //截取
			    int a=name.lastIndexOf("/");
			    name=name.substring(a+1);
			    
			    String desktopPath="C:\\Users\\Administrator.USER-20170515AI\\Desktop\\"+name+".class";
			    System.out.println(desktopPath);
			    try {
					FileInputStream fis=new FileInputStream(desktopPath);
					System.out.println(fis.available());
					int len=0;
					byte[] b=new byte[fis.available()];
					len=fis.read(b);
					return defineClass(null, b, 0, len);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return null;
		}
		
		
		
}
package com.zking.test;

import org.junit.Test;

import com.zking.diy.ClassLoaderDIY;

public class TestClassLoaderDIY {

	   @Test
	   public void test() throws InstantiationException, IllegalAccessException{
		    //使用自己的类加载器 加载对象
	        try {
			    Class clazz=Class.forName("com.zking.entity.Person", true, new ClassLoaderDIY());
			    System.out.println(clazz.newInstance());
	        } catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
	   }
	  
}

6.类加载器的工作原理:委托、可见性、单一性

   委托机制

当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目录,而PATH是定义的是可执行程序如javac,java等的执行路径。

  可见性机制

根据可见性机制,子类加载器可以看到父类加载器加载的类,而反之则不行。所以下面的例子中,当Abc.class已经被Application类加载器加载过了,然后如果想要使用Extension类加载器加载这个类,将会抛出java.lang.ClassNotFoundException异常。

  单一性机制

根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加载器是可能的,但这样做并不可取。你写自己的类加载器的时候应该严格遵守这三条机制。


7.网络类加载器(可以了解一下,如果有时间博主会补充上)


最后,欢迎大家来指出博主的错误之处。


Python Trimesh库实战:5分钟搞定STL文件解析与3D模型可视化 本文介绍了如何使用Python的Trimesh库快速解析STL文件并进行3D模型可视化。通过简洁的代码示例,演示了从环境搭建、模型加载、几何数据提取到基础变换和批量处理的核心流程,帮助开发者和工程师在5分钟内高效完成3D数据处理与可视化任务。 阅读详情

相关推荐

ANSYS workbench (关于normal stiffness factor接触刚度因子)

关于normal stiffness factor接触刚度因子的含义和设置方法

weixin_43730845的博客 6803

Java类加载器

import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.List; public class MyClassLoader exte...

xucr1111的博客 177

Android GWP-Asan机制详解

基本用途:GWP-ASan是一种原生内存分配器功能,在内存分配时额外记录一些信息,用于检测DOUBLE_FREE、USE_AFTER_FREE、INVALID_FREE、BUFFER_OVERFLOW、BUFFER_UNDERFLOW五种内存错误问题。

专注于系统快稳省领域 4143

七.类加载器

Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader) 1.类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表...

weixin_39912640的博客 174

南邮 2024 软件安全 实验四 自动脱壳+手动脱壳

这次这个实验很简单,就是一个简单的脱壳,然后进行爆破就行了,解法非常的多这里不多讲,会简单讲一下特殊情况这个点开是这样子:然后放进peid里面查看,我这个是原版的PEid,所以显示出来是这样:会显示nothing found,但其实如果你使用吾爱破解的魔改过的peid,它就会显示具体的壳名:然后你点击右下角的那个箭头,里面会有很多的插件用来自动脱壳:你也可以使用这个通用脱壳器,但是脱壳后的程序无法运行,这个放到后面讲。

ARbing_an的博客 2556

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1173

JVM(七):类加载器模型

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取! 从虚拟机的角度出发,只存在两种类加载器,一种是启动类加载器(BootStrap ClassLoader),对于HotSpot来说,启动类加载器是由C++语言来实现的,但可能对于其他厂家的虚拟机,比如MRP、Maxint等,整个虚拟机都是纯Java语言编写的;而另外一种则是其他类加载器,这些类加载器都是使用Java代码来进行实现的,独立于Java虚拟机,并且全都继承自抽象类java.lang.ClassLoa

cwcnl25131的博客 636

同花顺客户端数据采集:Hook注入与内存解密实战

在金融量化领域,客户端数据采集是获取低延迟、高精度行情的关键技术路径。其底层涉及进程通信、内存加密、反调试等典型Windows逆向工程问题。理解API Hook原理与AES-CBC动态密钥派生机制,有助于突破传统HTTP爬虫在国产金融软件中的失效困境。该技术不依赖网络劫持,而聚焦于本地进程内函数拦截与运行时内存解析,具备离线、可控、合规等工程优势,广泛应用于Level2行情、逐笔委托、分笔成交等高频数据场景,是量化基础设施中‘端侧数据主权’的重要实现方式。

weixin_30496999的博客 855

跟我一起学JVM(七)——类加载器

(一)类加载器 类加载器的作用: 将Class文件加载进JVM方法区,并在方法区中创建一java.lang.Class对象作为外界访问这个类的接口。 类加载器的种类: (1)启动类加载器 加载JAVA_HOME/lib下的class文件 (2)扩展类加载器 加载JAVA_HOME/lib/ext下的class文件 (3)应用程序类加载器 加载用户classpath下的class文件 注意:比较两个...

wzcspace 261

Unity中语法糖带来的GC问题 ——那些看起来优雅、实际上在背后偷偷生垃圾的代码

*语法糖(Syntactic Sugar)**指的是编程语言中为了让代码更简洁、易读而提供的简便写法。比如C#中的foreachlambda表达式LINQ自动属性等。语法糖本身不是坏事,但在Unity等对GC敏感的环境下,要警惕语法糖带来的隐式内存分配。合理使用语法糖,关键场合用更“丑陋”但高效的写法,才能保证游戏流畅运行。下面我将更深入地分析Unity中语法糖导致GC的原理、具体场景、检测与优化技巧,并补充一些容易忽视的细节。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 517

fatal: unable to access ‘https://github.com/xxx.git/‘ OpenSSL SSL_connect: SSL_ERROR_SYSCALL 解决方案

 本文主要介绍了fatal: unable to access ‘https://github.com/xxx.git/’: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 24万+

JVM篇(七)--类加载器

1.类加载器介绍 启动类加载器:是系统最底层的加载器,负责加载java的工具类,加载Jre/lib/rt.jar 扩展类加载器:这个一般不常用加载Jre/lib/ext/*jar这个目录下的所有数据 应用程序类加载器:主要加载Class_path指定目录所有jar,我们写的程序啊,第三方jar包spring,hebernate等都由此加载。 自定义加载器:有一些不在CLASS_PATH中,也不在Jre目录下,或者是网络流加载类,可以写自定义去加载。 前三个都是jvm自带的,后一个是我们自己开发

dfBeautifulLive的博客 326

12306自动抢票系统:基于DrissionPage的智能购票实战

摘要:本文介绍了一个基于DrissionPage的12306自动抢票系统实现方案。该系统通过模拟真实用户操作,实现了车票查询、登录认证、座位选择和订单提交的全流程自动化。项目采用DrissionPage库替代传统Selenium方案,具有更简洁的API设计和更好的性能表现。核心技术包括数据包监听、动作链模拟和反爬虫应对策略,实现了高效可靠的车票抢购功能。系统包含完整的业务流程设计,从环境初始化到最终订单提交,并提供了清晰的数据展示界面。本文强调该项目仅用于技术研究,在实际使用中应严格遵守12306平台规则

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 2789

JAVA提高七:类加载器

今天我们学习类加载器,关于类加载器其实和JVM有很大关系,在这里这篇文章只是简单的介绍下类加载器,后面学习到JVM的时候还会详细讲到类加载器,本文分为下面几个小节讲解: 一、认识类加载器 1.什么是类加载器? 所谓的类加载器可以从其作用来理解,其功能就是将classpath目录下.class文件,加载到内存中来进行一些处理,处理完的结果就是一些字节码.那是谁把这些class类加载到内存中来的...

weixin_30496751的博客 91

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM学习笔记(七)-类加载器

回顾   上一篇博客复习了JVM的类加载过程,对加载、验证、准备、解析、初始化等各个阶段进行了详细内容的复习。但是,关于类加载,还有一块重要的知识——类加载器,它跟加载阶段、解析阶段等有着紧密的联系。   本篇博客将会对类加载器的分类、双亲委派模型以及打破双亲委派等方面进行复习。 类加载器的分类   我们常把类加载器分为四类: 启动类加载器(Bootstrap ClassLoader) 扩展类加...

weixin_38985283的博客 238

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JVM(七):类加载器模型,轻松拿下offer

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)最新整理电子书习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)[外链图片转存中…(img-AWOn4BXu-1711963108723)]

927

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入java虚拟机(七)深入源码看java类加载器ClassLoader

ClassLoader类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称(即为包名加类名的全称),那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 

u014654942的专栏 462

JVM(七)-类加载与类加载器

1.一个类的生命周期 1.1 类生命周期7个阶段   类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载7个阶段.其中验证,准备,解析3个部分统称为连接(Linking) 1.2.阶段顺序   加载,校验,准备,初始化,和卸载这五个阶段的顺序是确定的,但是对于"解析"阶段则不一定,它在某些情况下可以在初始

qq_45803643的博客 445

【基础篇】七、线程上下文类加载器打破双亲委派机制

SPI,Service Provider Interface,是JDK内置的一种服务提供发现机制。大致流程:写个小Demo直观感受下SPI,定义对外接口: 其他类写实现类(这里接口和实现类放同一个jar中了,一般来说写接口和写实现的是两种角色): 写文件: 测试模块中引入上面的这个jar: 尝试加载: 成功获取到接口的两个实现类:JDBC使用DriverManager类来完成不同数据库厂商的驱动注册: DriverManager位于JDK的rt.jar包,由启动类加载器去加载,而引入的第三方jar包归应用

llg___的博客 1497

深入理解JVM(七):线程上下文类加载器

每个类都会使用自己的类加载器(即加载自身的类加载)来去加载其它类(指的是所依赖的类) 如果ClassX引用了ClassY,那么ClassX的类加载器就回去加载ClassY(前提是Class尚未被加载) 线程上下文类加载(Context ClassLoader) 线程上下文类加载器是从JDK1.2开始引用的,getContextClassLoader()与setContextClassLoader(ClassLoader cl) 用来分别获取和设置上下文类加载器 如果没有通过setContextClassLo

qq_34069839的博客 829

JAVA从入门到基础(七) 一 类加载器

JAVA从入门到基础(六) 一 GC参数、一 Class装载验证流程 加载:装载类的第一个阶段会取得类的二进制流,之后转为方法区数据结构并在Java堆中生成对应的java.lang.Class对象。 链接验证目的:保证Class流的格式是正确的 文件格式的验证是否以0xCAFEBABE开头 版本号是否合理 元数据验证 是否有父类? 是否继承了final类? 非抽象类实现了所有的抽象方法! 字节码验

OovEver的专栏 396

java 类加载器卸载_JVM学习七:JVM之类加载器之类的卸载

类加载的过程和原理,以及双亲委派机制都已经讲解完成,那么我们今天讲解类加载的最后一节,那么就是类的卸载。我们知道,当一个类被加载、连接和初始化之后,他的生命周期就开始了,当该类的class对象不再被引用之后,该类的生命周期也就结束了,之后,该类会被类加载器卸载!我们来看以下代码:public class UninstallTest {public static void main(String[]...

weixin_39524959的博客 588
上一篇: 六、自定义MVC
下一篇: 八、反射
_北冥有鱼_
博客等级 码龄10年 41粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值