在之前已经对类加载器做了不少实验了,这次主要是来分析一下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源码分析与实例剖析的更多相关文章

  1. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  2. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

  3. [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast

    [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...

  4. Vector源码分析和实例应用

    1.Vector介绍 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector ...

  5. LinkedList源码分析和实例应用

    1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...

  6. ArrayList源码分析和实例应用

    1.ArrayList介绍 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcces ...

  7. Set集合架构和常用实现类的源码分析以及实例应用

    说明:Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). (01) Set 是继承于Collection的接口.它是一个不允许 ...

  8. dubbo同步调用、异步调用和是否返回结果源码分析和实例

    0. dubbo同步调用.异步调用和是否返回结果配置 (1)dubbo默认为同步调用,并且有返回结果. (2)dubbo异步调用配置,设置 async="true",异步调用可以提 ...

  9. 探索JVM底层奥秘ClassLoader源码分析

    1.JVM基本结构: *.java--------javac编译------>*.class-----ClassLoad加载---->运行时数据区------->执行引擎,接口库-- ...

随机推荐

  1. ubuntu 右上角网络图标不见了

    sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service ...

  2. 【计算机视觉】深度相机(九)--OpenNI API及中间件说明

    本文由官方文档翻译而来 总览 目的 OpenNI 2.0 API(应用程序编程接口)提供了访问PrimerSense的兼容深度传感器.这就使得一个应用程序能够初始化传感器和从设备接收深度(depth) ...

  3. 洛谷 题解 P2119【魔法阵】

    很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...

  4. 如何克服社交恐惧症?zz

    zhang Bavol 清华大学核能与新能源技术研究院——核科学与技术/电子爱好者     你说的这个恐惧症我也有一点点,不过现在我是只对那种不是很熟悉的七姑八婆之类的亲戚才会有这种憋屈感觉,对朋友和 ...

  5. oracle-function-into时为null报错

    oracle-function-into时为null报错 create or replace function P_ADD_CUSTOMER_FOR_CSS_heyt_test(i_cust_name ...

  6. Mac命令行启动关闭Tomcat

    在Tomcat目录的bin目录下执行sh startup.sh或./startup.sh命名启动Tomcat,执行sh shutdown.sh或./shutdown.sh命令关闭Tomcat 浏览器输 ...

  7. 通过ImageReader进行图像裁剪时出现NoSuchElementException异常

    首先放上最初的Image工具类 package util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import ...

  8. 第四章 MIZ701 ZYNQ制作UBOOT固化程序

      4.0难度系数★☆☆☆☆☆☆ 4.1是什么是固化 我们前几章将的程序都是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序.JTAG的方法是通过TCL脚本来初始化P ...

  9. [Lua]LuaAPI整理

    ref :https://blog.csdn.net/ouyangshima/article/details/43339571   LUA和C/C++的沟通桥梁——栈 Lua生来就是为了和C交互的,因 ...

  10. Javascript中的继承与复用

    实现代码复用的方法包括:工厂模式.构造函数模式.原型模式(<高三>6.2章 P144),它们各自的特点归结如下:1.工厂模式虽然使创建对象一定程度上实现了代码复用,但却没有解决对象识别问题 ...