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(学习笔记)的更多相关文章

  1. ClassLoader 学习笔记

    概述 在经过编译后.java文件会生成对应的.class文件,但需要执行的时候,虚拟机首先会从class文件中读取必要的信息,而这个过程则成为类加载.类加载时类的生命周期的一部分,也是它的初始步骤. ...

  2. Java ClassLoader 学习笔记

    参考 Java类加载器(ClassLoader)

  3. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  4. [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. 测试Servlet生命周期学习笔记

    测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...

  6. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  7. Solr学习笔记之1、环境搭建

    Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...

  8. java jvm学习笔记二(类装载器的体系结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...

  9. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  10. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

随机推荐

  1. LongAdder源码分析

    AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAd ...

  2. Selenium基础教程(三)自动化插件Katalon

    Katalon-一款好用的selenium自动化测试插件 Selenium 框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化 ...

  3. Java核心技术 卷一(序言+0-5)

    l 常见简写: JDK(Java Development Kit):Java开发工具包 API:应用程序编程接口 OOP(Object-Oriented Programming):面向对象程序设计 l ...

  4. [转帖]程序员:我终于知道post和get的区别

    程序员:我终于知道post和get的区别 置顶 2019-11-14 00:03:09 zhanglinblog 阅读数 15316 文章标签: post和get的区别程序员 更多 分类专栏: .ne ...

  5. 关于C语言中整数范围的一些解释

    示例代码 #include <stdio.h> int main() { ; printf("%d\n", c); ; printf("%d\n", ...

  6. C#怎么判断字符是不是汉字 汉字和Unicode编码互相转换

    判断一个字符是不是汉字通常有三种方法,第1种用 ASCII 码判断(在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,根据这个范围可以判断),第2种用汉字的 UNICODE 编码范围 ...

  7. Ubiq:A Scalable and Fault-tolerant Log Processing Infrastructure

    Abstract 互联网应用通常会产生大量的时间日志需要进行分析和处理.本文介绍Ubiq的架构,它是一个分布式系统,用于处理不断增长的日志文件,具有可扩展性.高可用.低延迟的特性.Ubiq框架容忍基础 ...

  8. 『炸弹 线段树优化建图 Tarjan』

    炸弹(SNOI2017) Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸 时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi ...

  9. 部署elasticsearch(三节点)集群+filebeat+kibana

    用途 ▷ 通过各个beat实时收集日志.传输至elasticsearch集群 ▷ 通过kibana展示日志 实验架构 名称:IP地址:CPU:内存 kibana&cerebro:192.168 ...

  10. SSRS连接ORACLE数据库制作报表

    SSRS报表基于ORACLE数据库做报表示例. 开发环境:VS2010 SQL SERVER 数据库:SQL SERVER 2012 PS:数据库连接部分可能有还有个问题就是ORACLE数据源这一部分 ...