1. 类加载器

Class类描述的是整个类的信息,在Class类中提供的方法getName()是根据ClassPath配置的路径来进行类加载的。若类加载的路径为文件、网络等时则必须进行类加载这是就需要用到ClassLoader类。

ClassPath:加载类的路径。

(1)ClassLoad:

类加载器用来加载 Java类到Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成Java字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。

观察类加载器的存在性:

    1. //自定义类,也在ClassPath路径下
      1. class Message{}
        1. public class Test2{
          1. public static void main(String[] args) throws Exception {
            1. Class<?> class1 = Class.forName("reflect.Message");
              1. System.out.println(class1.getClassLoader());
                1. System.out.println(class1.getClassLoader().getParent());
                  1. System.out.println(class1.getClassLoader().getParent().getParent());
                    1. }
                      1. }
                    1.  

                    通过上述程序结果我们可以看到两类类加载器:AppClassLoader、ExtClassLoad;实则jdk默认提供如下几种类加载器:

                    A. BootStrap:

                    也称为启动类加载器或核心类加载器。由C++实现,是JVM虚拟机的一部分。

                    除BootStrap外其他类加载器是由Java语言实现,独立于JVM并且继承与iava.lang.ClassLoader。

                    主要负责加载JAVA_HOME/lib(典例:rt.jar)

                    bootStrap类加载器不能直接被程序使用。

                    B. ExtClassLoader:

                    扩展类加载器,主要加载JAVA_HOME/lib/ext

                    有Java语言实现可以被Java程序直接使用。

                    C. AppClassLoader:

                    应用程序类加载器,主要负责用户类路径(ClassPath)配置下的类库。若用户为自定义类加载器则默认使用AppClassLoader。

                    以上三种类加载器加载的代码都必须要求在CLASSPATH中加载。

                    类加载器带来的好处:

                    可以通过动态的路径进行类的加载操作。

                    (1)自定义类加载器

                    用户决定类从哪里加载。

                    ClassLoad类中提供进行类加载的方法:

                    protected Class<?> loadClass(String name, boolean resolve)

                    比较两个类相等的前提:

                    必须是由同一个类加载器加载的前提下才有意义。否则,即使两个类来源于同一个Class 文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类注定相等。

                    2. 类加载器的双亲委派模型

                    (1)双亲委派模型定义

                    四中类加载器的层次关系就称为双亲委派模型。

                    (2)双亲委派模型中除了BootStrap外,其他类加载器都有自己的父类加载器。

                    (3)工作流程:

                    当一个类加载器收到加载类请求时,先不自己处理而是把加载请求委托给父加载器处理,只有当所有父加载器无法加载此类时子类才尝试自己加载。

                    好处:保证Java程序的稳定执行。

                    (4)双亲委派模型从jdk1.2之后引入,但它不强制约束,甚至可以破坏双亲委派模型来进行类加载(典型:OSGI技术:Java模块化技术)。

                    (5)双亲委派模型可保证Java程序的稳定执行(如:自定义java。Lang包下的Object类,类加载器始终都不会对自定义的进行加载)。

                    ClassLoad类加载器与双亲委派模型的更多相关文章

                    1. 【深入理解JVM】类加载器与双亲委派模型

                      原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...

                    2. Java自定义类加载器与双亲委派模型

                      其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...

                    3. 【深入理解JVM】:类加载器与双亲委派模型

                      类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

                    4. 深入理解java虚拟机(九)类加载器以及双亲委派模型

                      虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...

                    5. JVM类加载器以及双亲委派模型

                      从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...

                    6. 【深入理解JVM】类加载器与双亲委派模型 (转)

                      出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...

                    7. Tomcat 类加载器打破双亲委派模型

                      我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...

                    8. 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

                      前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...

                    9. 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型

                      一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...

                    随机推荐

                    1. 记录 mysql 使用时遇到的问题

                      1,linux平台上mysqld和mysql的区别. 首先,mysql数据库是标准的c/s架构,yum安装时注意到了,有mysql和mysql-server包 mysql是客户端的工具,mysqld ...

                    2. [命令行]Mysql 导入 excel 文件

                      将 excel 表格中的数据批量导入数据库中 将要导入的表删除字段名,只留下要导入的数据. 将文件另存为 *.csv格式,可以用记事本打开(实际上就是标准的逗号分隔的数据 进入mysql,输入命令,打 ...

                    3. 『学了就忘』Linux基础命令 — 23、文件基本权限的介绍和作用

                      目录 1.基本权限的介绍 (1)权限位的含义 (2)权限的优先级 2.权限的基本作用 (1)权限含义的解释 (2)目录权限说明 1.基本权限的介绍 (1)权限位的含义 前面讲解ls命令时,我们已经知道 ...

                    4. 合并代码操作 | git fetch 与 git pull

                      前言 首先我们要说简单说git的运行机制.git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程 ...

                    5. ES6基础知识(async 函数)

                      1.async 函数是什么?一句话,它就是 Generator 函数的语法糖. const fs = require('fs'); const readFile = function (fileNam ...

                    6. Django笔记&教程 3-2 模板语法介绍

                      Django 自学笔记兼学习教程第3章第2节--模板语法介绍 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/topics/templates/# ...

                    7. [gym102900H]Rice Arrangement

                      (可以先阅读题目中关于顺逆时针的定义,避免理解错误) 考虑一盘菜$b_{i}$被$a_{j}$吃掉,对于其最后一次移动:如果是顺时针,则称$b_{i}$的移动区间为$[a_{j},b_{i}]$(若$ ...

                    8. HashSet 如何保证元素不重复——hash码

                      HashSet 不重复主要add 方法实现,使用 add 方法找到是否存在元素,存在就不添加,不存在就添加.HashSet 主要是基于HashMap 实现的,HashMap 的key就是 HashSe ...

                    9. processon刷文件的骚操作

                      https://github.com/ilikly/ProcessOnRegister用法自己看说明哈,群友亲测可用,而且也给别人用了...缺点是每轮都需要手动操作一下,并且需要俩微信号

                    10. docker创建mongodb并且测试代码

                      mongodb docker 安装mongodb-创建用户  docker run -itd --name mongo -p 27017:27017 mongo --auth 进入数据库添加密码   ...