博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 不同类载入器命名空间的理解
阅读量:6292 次
发布时间:2019-06-22

本文共 918 字,大约阅读时间需要 3 分钟。

            曾经一直有这样一个疑惑:

       都说在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。

转载于:https://www.cnblogs.com/clnchanpin/p/6971432.html

你可能感兴趣的文章
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>