zoukankan      html  css  js  c++  java
  • 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的说明:

  • 相关阅读:
    spring注解集合
    spring工作原理理解
    Linux下mysql命令 导入 导出sql文件
    List和Set排序的实现
    LeetCode--树
    LeetCode--链表
    LeetCode--字符串
    LeetCode--贪心算法
    LeetCode--数组
    数据库编程基本练习题
  • 原文地址:https://www.cnblogs.com/webor2006/p/9061868.html
Copyright © 2011-2022 走看看