关于Classloader(学习笔记)
1)类加载的过程是怎么样的?
①加载:根据具体需求,选择合适的加载器(Bootstrap ClassLoader不可直接获取、Extension ClassLoader、系统、自定义)来控制字节流的获取,实例化一个Class对象作为数据访问入口。
②连接(验证,准备,解析):(JVM)
a.验证,在加载阶段不能保证字节流的来源就是由纯粹的java代码编译过来的,也有可能是在网络中下载的、别人给的文件、zip包等,所以要进行验证(文件格式验证、元数据验证、字节码验证、符号引用验证);
b.准备,给类变量(静态变量)分配内存并设置初始值的阶段;(注意:类变量有无final修饰)
c.解析,将常量池内的符号引用替换为直接引用;
③初始化:真正执行Java代码,只会被执行一次。这里还要通过类构造器,将指定的初始值赋予给静态变量。(注意:此时与上面在准备阶段为类变量设置初始值 不同);
2)两个不同的类加载器加载同一个类,如何进行区分和隔离?
双亲委派机制
观察ClassLoader的loadClass()方法:
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
if (c == null) {
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
得出:当接到加载类的请求时,先检查是否已经被加载过,判断没有被加载过后,先将加载任务委托给父加载完成类加载任务,因此所有加载请求都应该传送到启动类加载其中,只有父加载器无法完成此加载任务时抛出异常,同时自己才去加载。
又因为各个加载器之间是一种组合的关系,都有各自的分工,不同的类加载器实例加载的话,会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同Class实例。在请求委派的过程中,每一个层次类加载器都要如上操作,实现层级委任。
从此保证了,不同ClassLoader对象加载的同名类属于不同的类型,它们之间不能相互转化和兼容。同一类的类加载器,不同的对象加载出来的类也不是同一个类。从而达到区分和隔离的效果。
关于Classloader(学习笔记)的更多相关文章
- ClassLoader 学习笔记
概述 在经过编译后.java文件会生成对应的.class文件,但需要执行的时候,虚拟机首先会从class文件中读取必要的信息,而这个过程则成为类加载.类加载时类的生命周期的一部分,也是它的初始步骤. ...
- Java ClassLoader 学习笔记
参考 Java类加载器(ClassLoader)
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 测试Servlet生命周期学习笔记
测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- Solr学习笔记之1、环境搭建
Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...
- java jvm学习笔记二(类装载器的体系结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...
- Java学习笔记——动态代理
所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
随机推荐
- 关于ThinkPHP独立分组的一些使用注意事项
关于ThinkPHP的独立分组,功能看上去挺好的,可是官方并没有给出详细的例子和说明,在此,根据实际的开发过程,给予各位php开发人员以下几点说明: 1.独立分组的目录结构 和官方说明一样,建立Mod ...
- Aliyun发送短信接口调用方法
aliyun新版发送短信讲的不是很清晰,初次使用一堆dll不知道用哪个,以.net为例 申请SignName与Template_code请先申请,一般两个小时能通过 一.https://help.al ...
- sitecore-多变量测试与A / B测试概念论述
sitecore-多变量检验和A / B检验的区别 A / B测试和多变量测试有什么区别?让我们来看看这些测试方法的方法,常见用途,优点和局限性. sitecore中A / B测试 A / B测试(您 ...
- Android工具使用之UiAutomatorViewer
学习博客: https://blog.csdn.net/l403040463/article/details/79235670 使用, 添加web 网页的监控.
- Matlab的solve()函数的使用方法
Matlab的solve()函数的使用方法 1.首先是对方程的求解 不废话直接上例子 syms x: eq=x^2+2*x+1; s=solve(eq,x); 结果如下 完美的算出了方程的解 现在对上 ...
- ArrayDeque详解
美人如斯! ArrayDeque是java中对双端队列的线性实现 一.特性 无容量大小限制,容量按需增长: 非线程安全队列,无同步策略,不支持多线程安全访问: 当用作栈时,性能优于Stack,当用于队 ...
- 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
步骤1,打开 Navicat Premium ,创建一个新的 mysql 数据库: 步骤2,选中刚刚创建的新数据库 ,双击选中后点击导入向导,然后选择 "ODBC",并点击下一步 ...
- java之maven之maven的使用
这里使用的工具是 myeclipse ,所以这里讲的是在 myeclipse 上使用maven. 1.什么是仓库? 用于存放依赖包.配置文件.其他插件等. 项目添加依赖时,默认从 本地仓库 读取依赖包 ...
- python基础知识(一)
Python基础知识 计算基础知识 1.cpu 人类的大脑 运算和处理问题 2.内存 临时存储数据 断电就消失了 3.硬盘 永久存储数据 4.操作系统 调度硬件设备之间数据交互 python的应用和历 ...
- 基于OpenGL的三维曲面动态显示实现
在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成. 1.基于OpenGL绘图的基本设置 1.1 设 ...