以前一直有这样一个疑惑:

都说在JAVA中,由不同类加载器加载的类在虚拟机中位于不同的命名空间下,不同命名空间下的类相互不可见。

这让我产生了一个迷惑:如果有一个类A使用了java.util.List类,为什么在运行时会没有错误。因为按照类加载的双亲委派机制,自己写的类A一般由系统类加载器加载,而java.util.List肯定是由启动类加载器(也叫Root类加载器)加载的,所以这两个类应该不在一个命名空间下。那在运行时为什么类A还 是能访问到java.util.List?

现在搞明白了,原因如下:

首先我们明白,每一个JAVA类经过加载后,在虚拟机中都有一个对应的类型。

再有以下概念:如果类A被系统类加载器加载,那么该系统类加载器就是此A在虚拟机中对应类型的 初始类加载器

Java虚拟机为每个类加载器维护了一个表,其中记录了将该类加载器作为初始类加载器的所有类型。在加载一个类时,虚拟机使用这些列表来决定是否一个类已经被特定的类加载器加载过了(如果该类型在当前类加载器的列表中,就说明已经加载过了,就不再加载)。

再回到刚到A使用java.util.List的例子,当A被加载后,解析到A使用了List,就会请求加载java.util.List。根据类的加载原理及双亲委派机制。会先请类A的类加载器,即系统类加载器加载java.util.List,系统类当然加载不了这个List,所以它会委派给自己的父加载器,即扩展类加载器;同理,最终会由根据类加载器加载这个java.util.List,并成功返回。

根据Java虚拟机规范规定,在这个过程中涉及的所有类加载器--即从系统类加载器到根类加载器间,参与过加载的,都被标记为该类型的初始类加载器。换句话说,java虚拟机为在第一个类加载器维护的表中添加一个类型,用来标明此加载器是该类型的初始类加载器。

这样就不难理解类A为何可以使用java.util.List。尽管它们不是由一个加载器加载的,因为在系统类加载器的表中,即维护了类型A,也维护了类型List。

java list 命名空间,Spring JAVA 不同类加载器命名空间的理解相关推荐

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  2. java 父委托机制优点_类加载器及父亲委托机制

    一.类加载器 1.在Java中,有两种类型的类加载器,分别是JVM自带的类加载器和用户自定义的类加载器. 2.JVM自带的类加载器有三种,如下: 根(Bootstrap)类加载器:该加载器没有父加载器 ...

  3. java import自定义类_自定义类加载器-从.class和.jar中读取

    一. 类加载器 JVM中的类加载器:在jvm中,存在两种类加载器, a) Boostrap ClassLoader:这个是由c++实现的,所以在方法区并没有Class对象的实例存在.用于加载JAVA_ ...

  4. java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器

    线程上下文类加载器 线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的getContextClassLoader() 与 set ...

  5. 类与类加载器---《深入理解java虚拟机》

    2019独角兽企业重金招聘Python工程师标准>>> 类加载器虽然只用于实现类的加载动作,但它在java程序中起到的作用却远远不限于类加载阶段. 对于任意一个类,都需要由加载它的类 ...

  6. Java面向对象系列[v1.0.0][类加载器]

    类加载器负责将.class文件加载到内存中,并为它生成对应的java.lang.Class对象 类加载机制 类加载器负责加载所有的类,并未所有被载入内存中的类生成一个java.lang.Class实例 ...

  7. jvm十三:类加载器命名空间

    package com.atChina.jvm;import java.io.*;public class Test16 extends ClassLoader{private String clas ...

  8. 24.类加载器命名空间实战剖析与透彻理解

    1. new一个对象的类加载器 new MyCat() 会从当前Sample类的类加载器开始向上搜索,然后向下尝试加载 package com.wuyiccc.jvm.classloader;/*** ...

  9. 看视频时,类加载器没太理解,现在再整理下几个要点

    类加载器负责把类加载到java虚拟机即JVM中,指定类的名称,类加载器就会定位这个类的定义,每一个java类必须由类加载器加载. 当启动JVM的时候,我们可以使用三个类加载器:引导类加载器.扩展类加载 ...

最新文章

  1. STM32开发 -- UTC、UNIX时间戳、北京时间之间的转换
  2. python / 内置的数据结构概述
  3. LightGBM 相关知识理解
  4. 重新设计Hamcrest
  5. iOS11最新隐私信息访问列表
  6. 安卓教程:提取APK程序里图片资源的方法
  7. excel删除行 uipath_高级会计师都在用的Excel批处理技巧,祝你早日告别加班
  8. android点击按钮修改文本,如何在android中每3秒动态更改按钮文本?
  9. IDEA如何进行debug调试
  10. win10虚拟打印服务器,win10虚拟打印机驱动怎么安装_win10系统安装虚拟打印机驱动教程...
  11. Python之pip安装出现报错ERROR: Cannot unpack file
  12. MIMO中预编码Precoding和波束beamforming有什么区别?
  13. 阿里妈妈返利比率的商品搜索API接口
  14. SpringCloud 微服务(一)
  15. 国科大学习资料--人工智能原理与算法-第十三次作业解析(学长整理)
  16. 新浪微博PC客户端,(蓝星星微博客户端)VC++
  17. 将距离度量学习应用于购物问题
  18. AI展现唇语识别能力,大数据功不可没
  19. 《百年中国文学史》狂人日记
  20. js第三章简答题5(制作如图所示的Tab切换效果)

热门文章

  1. 目标检测——Anchor-Based算法的学习笔记
  2. 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
  3. 物联网设备获取北京时间、年月日、星期几,GMT格林威治标准时间转换为北京时间,授时api Fiddler抓包调试
  4. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器
  5. vue 组件模板template定义时的注意事项
  6. 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)
  7. 【xxl-job】轻松实现分布式定时任务demo实例
  8. PHP23 AJAX分页
  9. 浅谈localStorage、sessionStorage 与cookie
  10. 获得驱动器信息卷设备Ring3得到磁盘文件系统(NTFS WIN10)