ClassLoader源码分析与实例剖析
在之前已经对类加载器做了不少实验了,这次主要是来分析一下ClassLoader的源码,当然主要是先从理解官方给它的注释开始,为之后自定义类加载器打好坚石的基础,下面开始:
而从类的层次结构来看也能感受到,如下:
其中该类的javadoc篇幅比较长,但是这文档是最据有权威性的,逐字逐句的去阅读它有助于咱们对它有一个精准的认识,所以下面耐着性子开阅读之旅,在阅读前需要介绍一个IntelliJ IDEA的一个进入Document的模式的方法,对于类中的注释其实有一些跳转之类的影响咱们阅读,如下:
而对于IDE来说有一种专门针对这个注释而转换成的文档阅读起来会比较舒服,其快捷键的设置在这:
将光标定位到要读的javadoc处,然后按相印的快捷键既可弹出一个Document的弹窗,如下:
好~~下面正式开始阅读:
给定了一个类的"binary name",那什么叫“binary name”呢?这是一个链接文字,点击则可以链到它的具体解释,在继续分析之前先来对它有一个初步的了解:
好~~再回过头来继续阅读:
那为什么“locate or generate”这两种方式呢?locate是指直接能定位到的类,比如咱们使用JDK系统的类比如java.lang.String,是直接能定位到的;generate是指在运行期生成的,典型的是动态代理,在编译期是找不到的。
这就是典型在日常开发中使用到的嘛,上面说的是一种典型情况,当然还有其它一些情况啦,比如从网络上读取。
这也是为啥在Class类中有一个classLoader的原因所在,如下:
其实关于这点在之前的示例学习中有涉及到过,回顾一下【https://www.cnblogs.com/webor2006/p/8859014.html】:
关于ClassLoader的说明有很多,为了读一点理解一点,这里用代码先去验证一下目前所读到的:
为啥是null呢?根据则才读到的对于数组的类加载器,如果它的元素不是原生类型其类加载器就是元素类加载器,如下:
所以对于strings这个数组来说它的类加载器就是String的类加载器,而根据不同类加载器的特性:
很显然String的类加载器是根类加载器,而根类加载器就是用null来表示的,所以该数组的加载器最终打印就是null喽。
很显然MyTest15咱们自己编写的类的加载器是由应用类加载器来加载的,所以其结果就是它啦:
所对应的原因如:
所以这里需要特别注意:
好了,继续来读ClassLoader的说明:
ClassLoader源码分析与实例剖析的更多相关文章
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast
[源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...
- Vector源码分析和实例应用
1.Vector介绍 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector ...
- LinkedList源码分析和实例应用
1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...
- ArrayList源码分析和实例应用
1.ArrayList介绍 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcces ...
- Set集合架构和常用实现类的源码分析以及实例应用
说明:Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). (01) Set 是继承于Collection的接口.它是一个不允许 ...
- dubbo同步调用、异步调用和是否返回结果源码分析和实例
0. dubbo同步调用.异步调用和是否返回结果配置 (1)dubbo默认为同步调用,并且有返回结果. (2)dubbo异步调用配置,设置 async="true",异步调用可以提 ...
- 探索JVM底层奥秘ClassLoader源码分析
1.JVM基本结构: *.java--------javac编译------>*.class-----ClassLoad加载---->运行时数据区------->执行引擎,接口库-- ...
随机推荐
- 牛客竞赛(gcd,快速幂)
一.最大公约数和最小公倍数问题 题目描述: 输入2个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数. 条件:1.P, ...
- DB2分页
前言 最近在做一个DB2的项目,遇到分页处理的设计时开始犯难.以前一直采用MySQL作为项目数据库,其中的Limit关键字非常人性化,MySQL把分页的处理逻辑封装到了数据库的核心中,使得做查询设计时 ...
- d3学习之路
d3学习历程: 轻量化编译器:HbuiderXHbuiderX使用教程 理解HTMl js CSS 三者关系 学习html js css :1)w3school 2)moo ...
- javascript当中类型转换,typeof的用法
1)类型转换,typeof的用法 例 3.1.1 <HTML><head> <meta http-equiv="content-type" co ...
- Codeforces Round #590 (Div. 3) Editorial
Codeforces Round #590 (Div. 3) Editorial 题目链接 官方题解 不要因为走得太远,就忘记为什么出发! Problem A 题目大意:商店有n件商品,每件商品有不同 ...
- class CAdoInterface
AdoInterface.h #pragma once //#pragma warning (push) //以防会产生警告 C4018,但这个警告是没关系的,所以使用下一句代码屏蔽它 //#prag ...
- jquery【点击】导航按钮的来回切换
先获取元素的属性值,根据属性值进行判断,点击时对属性进行设置 <i class="layui-icon layui-icon-shrink-right" id="n ...
- ASP.NET跨平台、分布式技术架构技术栈概览 (迄今为止最全的.NET技术栈)
今天有个学技术的小兄弟问我,现在这么多的技术我要学哪个?我说你根据岗位来学,学好了哪一门都可以在社会上立足,如今已经早已不是我们当年学习IT时候那么单纯了,给他讲了很多,发现现在的技术栈变得层次复杂且 ...
- spark调优篇-Spark ON Yarn 内存管理(汇总)
本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也 ...
- UI自动化的第一步(Python,pip,selenium,PyCharm安装配置)
一,py安装 1.python下载,安装,环境配置 地址:https://www.runoob.com/python/python-install.html 注意:安装时,要勾选自动配置环境变量.这样 ...