类加载器的收获

用Cocotb和cocotbext-axi搭建你的第一个AXI4验证环境:从安装到第一个读写测试 本文详细介绍了如何使用Cocotb和cocotbext-axi搭建AXI4验证环境,从安装配置到实现第一个读写测试。通过实战代码示例,展示了AXI协议的基本操作、突发传输测试以及高级调试技巧,帮助开发者快速掌握数字芯片验证的核心技术。 阅读详情

类加载器的收获

最近读了很多关于ClassLoader的文章,收获不少。在这里赶紧总结回顾一下,吸收吸收。

首先,关于ClassLoader的一些基本的概念我就不再详细说了。如果连系统中不仅有一个ClassLoader,ClassLoader的作用,ClassLoader是有层次结构,为什么要有自定义类加载器,这些问题都还不明白,那么下文读起来肯定很吃力。

 

ClassLoader这个东西本身是很简单的,就是加载类。类加载分两步,一步是定义和加载,对应着ClassLoader的loadClass(define)方法,这个方法的作用是找到对应的Class文件,读取后,创建一个为这个类创建一个Class类的实例,并对字节码进行三遍验证;一个是初始化,这个进行的操作是将类的符号引用进行验证,对依赖的类进行加载,并且执行各种初始化方法(比如类中的static块)。经过这两步后,才能够真正的去使用一个类(调用方法、访其各个字段、创建对象等)。

ClassLoader之所以变的复杂,是因为在实际运用因为其层次关系和寻找的类路径不同而发生混淆。这主要发生在App Server上和一些使用代理的应用上。

这里有几点常识要提醒一下自己:

l         一个类在JVM中的类型是由类的全限定名+其所在的类加载器共同确定的。有一个不一样,JVM也会认为它们不是一个类,那么强制类型转换的时候就会出错。

l         每个 ClassLoader都有一个唯一的父ClassLoader,每次需要加载一个类的时候,使用委托的方式回溯递归到最根的ClassLoader(也就是启动类加载器,专门加载java核心类的),然后一层层的尝试去加载,也就是说,最先调用 loadClass的ClassLoader是最后一个去加载它的。

l         每个ClassLoader都有一个已经加载了的类的列表,基于以下两个事实:已经被一个ClassLoader加载了的类是不会这个ClassLoader被二次加载的;类加载采用委托模式。那么,子ClassLoader能够看到父ClassLoader和它自己加载的类,而无法看到其子ClassLoader和兄ClassLoader加载的类,这就是混淆的关键。

l         并不是调用loadClass(MyClass)的那个类加载器加载了MyClass类,而是那个读取到了MyClass字节码并在调用defineClass的时候将这个字节码流作为参数传递,的ClassLoader加载了MyClass类,MyClass将保存在那个ClassLoader的已加载类列表中。

l         哪个ClassLoader会去主动加载一个类呢?Java规范规定,当执行代码段A的时候,如果需要加载一个类B,那么,就由加载A的ClassLoader去加载B。一段代码总要属于一个类吧,一个类总要被一个ClassLoader加载的吧,那么好了,加载关系弄清楚了^_^。

有几种情况下我们需要注意ClassLoader的作用:

l         一个典型的App Server会为每一个应用创建一个ClassLoader,这样,每个应用的ClassLoader是兄弟关系,那么他们彼此之间加载的类信息是不可共享的,也就避免了应用间造成类使用混乱(尤其是在不同应用要使用不同版本的jar包时)。

l         还有就是各种应用接口的使用。如果需要动态的从数据源(比如说数据库、本地磁盘、网络、内存等)加载一个类,最好的方法是让这个类实现一个接口,将这个接口的class文件放在classpath目录下(或者别的目录,但是一定要保证这个类对AppClassLoader是可见的,这点很重要)然后用这个接口的引用指向这个类创建的实例。为什么要这么做呢?如果不这么做的话,你在程序中就只能够通过反射来访问这个动态记载的类的各种方法和字段了!为什么呢?因为AppClassLoader及其父ClassLoader无法加载这个你从自定义数据源加载的类,也就是说,在主程序中,根本就不知道这个自定义加载的类是什么,那么,就算你通过一些方法使得类编译通过,那么在运行时也会报错(ClassNotFoundException)。

l         上面的问题还有一个问题没有解决,就是如何在程序中创建ClassLoader并指定让它加载我们自定义的类呢?这里牵扯到一个争论很多的问题:Class.forName(String classNmae)和Thread.currentThread().getContextClassLoader().loadClass(String classNmae)应该用哪个?哪个更好?关于这个,javaworld上有篇文章论述的非常好,叫做“Get a load of that name! ”,还有“Find a way out of the ClassLoader maze”对之也有很精妙的说明。在这里我说一下自己的认识。前者(Class.forName(String classNmae))其就是使用调用Class.forName 这个方法的类的ClassLoader去加载classNmae 这个类(这话说起来好别扭-_-!)。举例来说:如果A类在way方法中有一行是Class.forName(”XXXX”),那么,forName方法会通过一个本地方法(Native Method)获得加载其调用者(也就是A类)的类加载器,然后用这个类加载器去加载XXXX类。后者(Thread.currentThread().getContextClassLoader().loadClass(String classNmae))其实是使用当前线程使用的ClassLoader去装载类。这个ClassLoader是在线程被创建的时候设置进去的,默认是继承父线程的ContextClassLoader这个值。这个问题搞清楚以后,就简单了,你可以按照自己的实际情况使用两者之一在程序中加载类。

l         关于类的更新。其实这里才是我关心ClassLoader的最初原因。一个类在被一个ClassLoader加载后,是不能够被更新或者卸载的。在Tomcat中,更新一个Servlet是通过创建一个新的ClassLoader,然后加载来实现的。同时Tomcat对应用中自定义的类也可以更新,但是这种更新的实现机制我还没有搞清楚,期望有和人讨论一下Tomcat的这个实现,我的msn是DeepNightTwo@hotmail.com。这个问题欢迎大家来讨论http://www.jdon.com/jive/thread.jsp?forum=16&thread=27932,

 

总的感觉:类加载器很简单,就好像画个横线很简单一样。但是怎么画在哪里画用什么画,都是问题。
树莓派c语言串口通讯程序 在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一 阅读详情

相关推荐

ANSYS APDL齿轮建模实战:从渐开线方程到完整3D模型的保姆级教程

本文详细介绍了使用ANSYS APDL进行齿轮建模的全过程,从渐开线方程的数学基础到完整3D模型的创建。通过参数化命令流实现高精度齿轮建模,特别适合机械设计和仿真分析需求。教程包含关键参数计算、APDL环境配置、单齿齿廓建模以及全齿轮阵列复制等实用技巧,帮助工程师快速掌握ANSYS APDL在齿轮建模中的应用。

lg888的博客 446

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

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

weixin_34405557的博客 5725

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 814

获取类加载器ClassLoader有哪些方式?

java 类加载器

weixin_44868723的博客 4697

Apollo 9.0 参考线生成器 -- ReferenceLineProvider

在基于参考线的规划算法中,参考线是Planning一切工作的基础和前提,所以搞清楚参考线怎么来的就变得很重要。为此,首先需要了解Planning 与 Routing的交互,通过交互得到路径片段,这些路径片段就告诉我们该怎么走,再在此基础上生成参考线,最后使用不同的平滑算法对参考线进行平滑,得到一条光滑的参考线。

WaiNgai 1665

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1634

什么是类加载器之类加载获取

类加载的获取

weixin_65493827的博客 595

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

XiaoqiangClub的博客 1万+

黑马程序员 类加载器和代理类学习日记

2011年8月7日星期日     其实这是我今天凌晨两点多才看完的,所以日记就写了今天的日期,心情是越来越好了,就快要完成任务。其实很累但也感受到收获的喜悦,是值得的。 我看了类加载器和代理的视频,在这里知道类加载器的作用和怎样去编写自己的类加载器的一般思路。其次看的是代理类

312

AutoSAR系列讲解(深入篇)14.7-Mcal Adc配置(上)

详细讲解了ADC的各个配置项的作用

雪云飞星的博客 1万+

倍福EL6002做RS232通信获取称重数据..

本文介绍EL6002模块通过RS232自由口通信协议获取从站数据。具体数据对照说明手册即可。

weixin_41883890的博客 1012

Java类加载器学习总结

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

lihuayong的专栏 757

2024年数字IC秋招-大疆-数字芯片开发工程师-笔试题

笔试题型:选择题 + 简答题笔试平台:大疆创新(电脑监控)笔试时间:90min做题感受:知识面覆盖很广,很多题目不会做(1) 什么是功耗优化中的DVFS技术?(2)降低功耗的原理是什么?(3)一般工作流程是怎样的?(4)必须的硬件模块有哪些?

qq_42135020的博客 2667

Java_类加载器

对Java类加载器的讲解分析,包含程序段

AI+全栈,AI+应用,实操落地,前沿技术 2258

假人有限元模型

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JVM类加载器

文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC 一、类加载器 从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语

rockvine的博客 3486

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

了解类加载器吗?类加载器的类型有哪些?

类加载器(ClassLoader)是JVM的核心组件,负责将.class文件加载到内存并生成Class对象。JVM内置三类加载器:Bootstrap(核心类库)、Extension(扩展类)、Application(应用类),支持自定义类加载器。类加载采用双亲委派机制,优先委派父加载器处理,确保核心类安全并避免重复加载。自定义类加载器通过继承ClassLoader实现,常用于热部署、插件系统等场景。线程上下文类加载器(如SPI)可突破双亲委派限制。理解类加载机制对Java模块化开发和安全部署至关重要。

笑衬人心的博客 1538

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

什么是类加载器,类加载器有哪些

类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将Java类的二进制代码加载到内存中,并转换为可执行的Java字节码。它是Java语言的重要特性之一,为Java应用程序提供了动态加载和运行时扩展的能力。类加载器的主要职责是根据类的全限定名(Fully Qualified Name)在运行时定位并读取类的字节码。类加载器使用一种称为双亲委派模型(Parent Delegation Model)的机制来加载类。

Flying_Fish_roe的博客 2293

类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来

m0_62943934的博客 1218

类加载器的作用

深入探讨 Java 类加载器 成 富, 软件工程师, IBM 中国软件开发中心 成富任职于 IBM 中国软件开发中心,目前在 Lotus 部门从事 IBM Mashup Center 的开发工作。他毕业于北京大学信息科学技术学院,获得计算机软件与理论专业硕士学位。他的个人网站是 http://www.cheng-fu.com。 简介: 类加载器(class loader)

zhouren1314的专栏 1944

类加载器详解

类加载器从 JDK 1.0 就出现了,最初只是为了满足 Java Applet(已经被淘汰) 的需要。后来,慢慢成为 Java 程序中的一个重要组成部分,赋予了 Java 类可以被动态加载到 JVM 中并执行的能力。根据官方 API 文档的介绍:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。不过,数组类不是通过。

m0_74267125的博客 819

java 类加载器

类加载器基本概念 什么是类加载器 顾名思义,类加载器(class loader)用来加载 Java 类到Java 虚拟机中。 具体的说就是:Java源程序(.java 文件)在经过Java 编译器编译之后就被转换成 Java 字节代码(.class文件)。类加载器负责读取 Java字节代码,并转换成 java.lang.Class类的一个实例。 系统提供的类加载器 系统提供的类加

卖克的专栏 4万+

Java类加载器及Android类加载器基础

引子Android插件化与热更新技术日渐成熟,当你研究这些技术时会发现类加载器在其中占据重要地位。Java语言天生就有灵活性、动态性,支持运行期间动态组装程序,而这一切的基础就是类加载器。Java中的类加载器Java灵活性和动态性的原因Java源代码被编译器编译成字节码,即从.java文件编译为.class文件,而.class文件就是通过类加载器加载到虚拟机内存中的。虚拟机的类加载(Class Lo

Battling against our own ignorance 3035

Java的类加载器有哪些

职责:满足特定需求的类加载器,通常在应用程序中自定义实现。实现:继承java.lang.ClassLoader并重写findClass方法。加载路径:由开发者自行定义,可以是文件系统、网络、数据库等。父类加载器:可以指定,也可以继承应用程序类加载器。@Overridetry {// 将类名转换为文件路径// 读取类文件的字节码// 将字节码转换为 Class 对象当内置的三大类加载器无法满足需求时,就需要自定义类加载器。目的加载非 ClassPath 路径的类。

埃泽漫笔 1093
上一篇: Get a load of that name! (很不错的文章!)
下一篇: Tomcat 配置集锦
DeepNightTwo
博客等级 码龄21年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值