博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础加强-类加载器
阅读量:7044 次
发布时间:2019-06-28

本文共 1853 字,大约阅读时间需要 6 分钟。

/*类加载器*/ 把.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)

转载于:https://www.cnblogs.com/xuzekun/p/7354698.html

你可能感兴趣的文章
Scala学习笔记——样本类和模式匹配
查看>>
【python下使用OpenCV实现计算机视觉读书笔记1】输入输出
查看>>
windows上通过secureCRT和putty创建密钥登录
查看>>
Hive快捷查询:不启用Mapreduce job启用Fetch task
查看>>
Java面试题
查看>>
CentOS下MySQL主从同步配置
查看>>
jQuery替换内容
查看>>
空暇时候思考2('\0'等价于数字0还是字符0)
查看>>
英语词汇周计划(1-1)group 1
查看>>
FreeRTOS基础知识
查看>>
3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
查看>>
关于逻辑或的一个小小应用注意点
查看>>
(一)Redis笔记——简介 、key 、数据类型
查看>>
第四篇:Web框架 - Django
查看>>
第九篇:随机森林(Random Forest)
查看>>
crontab命令详解
查看>>
高可用架构的6大常规方案【转】
查看>>
编程中的匈牙利命名法
查看>>
nj06---包
查看>>
Batch normalization:accelerating deep network training by reducing internal covariate shift的笔记
查看>>