深入分析ClassLoader

2017-01-07 10:38:35来源:oschina作者:白白胖胖的空格人点击

第七城市


首先介绍下ClassLoader:
ClassLoader顾名思义就是类加载器,负责将Class加载到JVM中,事实上ClassLoader除了能将Class加载到JVM中之外,还有一个重要的作用就是审查每个类应该有谁**加载**,ClassLoader是一个**父优先**的等级加载机制。ClassLoader除了上述两个作用外还有一个任务就是将Class字节码**重新解析**成JVM统一要求的对象格式-----------由此本文可以划分成三点
1. ClassLoader类结构分析
1. ClassLoader常用的方法
![![输入图片说明](/2014th7cj/d/file/p/20170107/i4txmpctaix.png "在这里输入图片标题")](/2014th7cj/d/file/p/20170107/i4txmpctaix.png "在这里输入图片标题")
1,defineClass():用来将byte字节流解析成JVM能够识别的Class对象
2,findClass():用来子类扩展的方法,目的是为了寻找类
3,loadClass():加载类,这里就可以动态加载了,程序运行的时候加载
4,resolveClass():这个方法是用来链接这个类
JDK给我们提供了可以扩展的,也就是我们可以自定义的类加载器URLCLassLoader,比较方便
2. ClassLoader的等级加载机制
![![输入图片说明](/2014th7cj/d/file/p/20170107/4lf04xn2ggk.png "在这里输入图片标题")](/2014th7cj/d/file/p/20170107/4lf04xn2ggk.png "在这里输入图片标题")
1,BootStrap ClassLoader:这是一个引导类加载器,首先声明一下虽说在类的结构中可以看到这个类,但是这个类只有Class文件,据了解这个类是通过C++编写的,这也就是ExtClassLoader的父类为空的原因。引导类负责加载JDK的jre下的类库,例如rt.jar
2,ExtClassLoader:这是一个扩展类加载器,加载bin目录下的ext文件夹下的jar包,不多说
3,AppClassLoader:这个类加载器就是我们自定义的类,例如我们的这个方法getSystemClassLoader()作为父加载器,这个加载器也就是AppClassLoader。
4,加载类过程总结:看了很多资料都是什么双亲委托加载机制,具体我也不是很清楚,可以我太low,但是我个人的理解就是,当加载一个类的时候:首先检查这个类是否已经被自己加载过,如果已经加载过,就拒绝本次加载,如果没有加载过,就会抛给他的父类,然后父类在检查是否加载,然后在抛给父类,直到全部检查完都没有发现这个类被加载,那么就有意思了,因为每一个类加载器都有自己的加载范围,然后开始判断,父类不加载类,那么就开始向下寻找这个类的加载器,然后这个类被加载,也就是先向上检查是否加载,其次向下看是否可以加载!
这里是类关系的代码
```
public class ClassA {
}
public class ClassB {
}
public class ClassTest {
public static void main(String[] args) {
//演示 我們的類加載器
System.out.println("ClassTest-------------ClassLoader:"+ClassTest.class.getClassLoader());
System.out.println("ClassTest.Parent------ClassLoader:"+ClassTest.class.getClassLoader().getParent());
System.out.println("ClassTest.GrandFather-ClassLoader:"+ClassTest.class.getClassLoader().getParent().getParent());

//用户自定义的类加载 都是通过AppClassLoader加载
System.out.println(ClassA.class.getClassLoader());
System.out.println(ClassB.class.getClassLoader());
//结论就是----------当两个类名称不同,那么这两个类就不相同
}
}
```
打印结果
```
ClassTest-------------ClassLoader:sun.misc.Launcher$AppClassLoader@73d16e93
ClassTest.Parent------ClassLoader:sun.misc.Launcher$ExtClassLoader@15db9742
ClassTest.GrandFather-ClassLoader:null
sun.misc.Launcher$AppClassLoader@73d16e93
sun.misc.Launcher$AppClassLoader@73d16e93
```
2. 如何判断两个类相同
- 类名称不同
- 包名称不同
- 类加载器不同
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台