/*类加载器*/ 把.class文件从硬盘上加载出来,将类的字节码(二进制)加载到内存中

/*类加载器及其委托机制*/
Java虚拟机中可以安装多个类加载器(可以自己编写),系统默认三个主要类加载器,每个类负责加载特定位置的类
BootStrap,ExtClassLoader,AppClassLoader

类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap(C++)
Java虚拟机中的所有类装载器采用具有父子关系的树状结构进行组织,在实例化每个类装载器对象时,需要为其制定一个父级类装载器对象
或者默认采用系统类装载器为其父级类加载

/*类加载器之间的父子关系和管辖范围*/
BootStrap ---- JRE/lib/rt.jr (一般java中自己有的类:如System类,Map等)
|
ExtClassLoader ---- JRE/lib/ext/* (第三方的类) */
|
AppClassLoader ----- CLASSPATH指定的所有jar或目录 (一般自己编写的类)
|
MyClassLoader(自己编写的ClassLoader)
/*委托机制*/
1.首先当前线程的类加载器去加载线程中的第一个类,
2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载B
3.还可以直接调用ClassLoader.loaderClass()方法来指定某个类加载器去加载某个类

/*每个类加载器加载类时,又先委托给其上级类加载器*/
1.当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不到,则抛出ClassNotFoundException,
不是再去找发起者类加载器的儿子,因为没有getChild()方法,即使有,那有多个儿子,找哪一个呢?
如:System类,AppClassLoader先发出申请,然后委托给ExtClassLoader,ExtCLassLoader同样将其抛出,委托给BootStrap ,
然后BootStrap 查找时候有这个类,然后加载这个类,如果BootStrap 没有找到这个类,则向下一级ExtClassLoader,以此类推,直到发起者
/*类加载器的加载都要让BootStrap 这个祖宗先查一遍,这样方便管理*/

/*编写自己的类加载器*/
1.自定义的类加载器必须继承ClassLoader
2.loadClass方法(调用)与findClass方法(覆写)
3.defineClass方法

父类 -->loadClass/findClass/得到class文件的转换成字节码-->defineClass()
只需要覆盖findClass方法,将某个类变成二进制数据,然后调用defineClass,将二进制数据变成相应的字节码文件
loadClass方法不要覆盖,保留类加载器的委托机制
/*loadClass() 方法里面分为两部分*/
/*第一部分*/是主要流程:即把一个类加载进内存的时候它要先去一级一级地找父类,看父类能不能加载,如果父类能加载的话,
就不用再返回到了,让该类加载, /*这部分就是委托机制*/

/*第二部分*/是细节部分:就是如果由该类自己加载该怎么加载。也就是findClass()部分

public abstract class ClassLoader {
private loadClass() {
//loadClass()中的主要流程
}
findClass(); //loadClass() 中的部分细节。
}

public abstract findClass() {

}
所以我们自定义加载器只需复写ClassLoader类中的findClass()方法就行了~~ (loadClass方法如果在前面的父类都无法加载,就会调用findClass加载)
MyClassLoader.loadClass() //自定义的加载器也是调用loadClass即可

主要方向:loadClass() -->loadClass() --> defineClass(String name,byte[] bytes, off, len)

-->findClass(String name)

Java基础加强-类加载器的更多相关文章

  1. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  2. Java基础之类加载器

    Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序.本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式( ...

  3. JAVA基础_类加载器

    什么是类加载器 类加载器是Java语言在1.0版本就引入的.最初是为了满足JavaApplet需要.现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类 ...

  4. java基础之—类加载器

    要了解类加载器先要了解类的加载 一.类的加载(类的加载概述) 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载 就是指将clas ...

  5. java 基础之--类加载器的过程

    先来段代码,大家瞧瞧运行pritln的结果是什么?(认真想一想哦

  6. Java中的类加载器

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制   我们知道,Java是一种动态语言.那么怎 ...

  7. Java中的类加载器--Class loader

    学习一下Java中的类加载器,这个是比较底层的东西,好好学习.理解一下.  一.类加载器的介绍 1.类加载器:就是加载类的工具,在java程序中用到一个类,java虚拟机首先要把这个类的字节码加载到内 ...

  8. 黑马程序员——【Java高新技术】——类加载器

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...

  9. Java中的类加载器以及Tomcat的类加载机制

    在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_15-网关-路由配置

    4.4 路由配置 4.4.1需求分析 Zuul网关具有代理的功能,根据请求的url转发到微服务,如下图: 客户端请求网关/api/learning,通过路由转发到/learning 客户端请求网关/a ...

  2. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_04-用户认证-认证服务查询数据库-查询用户接口-接口开发

    定义dao 权限放在授权的课程里面做,现在先不管.我们还需要查企业信息,就是用户所属的公司 公司表 对应关系在xc_company 这是一个关系 表 这个表里有唯一索引 user_id 所以根据use ...

  3. zabbix4.4 (server,proxy,agent)安装部署实战

    一. 部署架构图 二. 安装环境及版本信息 操作系统:centos7 zabbix版本: 4.4 mysql: 5.7.28 三.zabbix server安装(192.168.182.132) rp ...

  4. SUBMIT标准程序取ALV数据

    示例1: 调用J3RFLVMOBVEDH ,取物料的期初/ 期末庫存数.金额 FORM frm_call_j3rflvmobvedh. DATA: lr_bukrs TYPE RANGE OF buk ...

  5. (十一)使用Jconsole监控线程

    一.案例 监控线程情况,包括阻塞.死循环等 1.1 代码如下,下述代码共有三个线程,Main.mythread01.mythread02线程,其中mythread01线程为死循环.mythread02 ...

  6. lumen response全局函数设置header

    设置header Cache-Controlreturn response()->json($return)->header('Cache-Control', 'public');

  7. Web前端开发工具

    WebStorm: dreamweaver; Hbuilder: sublime text: 前端神器brackets.

  8. 用MOQ来Mock静态方法的 2种方法(含Moq和Fakes的配合使用)

    Moq是无法直接模拟静态方法的,解决方式有两种: 1.需要修改正式代码,在源代码中建一个新的方法把静态方法包起来,调用的时候源代码调用时调用新方法而不是原来的静态方法. 在测试的时候,Mock掉这个新 ...

  9. 【ARM-Linux开发】ARM板卡上QT显示中文

    平台:Freescale imx6  编译系统:yocto  Qt版本:5.5.1 刚弄了个Qt程序到开发板,发现中文都没有显示,英文可以显示.  就加了个中文字库.DroidSansFallback ...

  10. TiKV事务实现浅析

    TiKV事务实现浅析 Percolator事务的理论基础 Percolator的来源 Percolator事务来源于Google在设计更新网页索引的系统时提出的论文Large-scale Increm ...