网上看了一篇介绍类加载机制的博文,介绍的跟清晰,记录下概要笔记
1、类加载机制是干嘛用的
2、有哪些类加载器
3、这些类加载器是如何工作的
4、如何实现自定义类加载器
1、java文件要想运行,是要先编译成class文件,我们的java程序打好jar包,启动时会有一个入口类入口函数,在这个类中会引入一些别的class文件的方法,
如何找到这一层一层关联的class文件加载到内存中捏,这就是类加载器的工作。
2、有3个默认的类加载器boostrap classloader、extention classloader、app classloader
boostrap classloader是C++代码写的加载器,内嵌到jvm中,是最开始的类加载器,它加载jdk中基本的class文件,如rt.jar、changset.jar、resources.jar
也就是说在jvm启动的时候就把这些基础的class类在到内存中。
extention classloader是集成classloader的最上层父类,它加载jdk下lib/ext路径下的class文件
app classloader也集成classloadrer,它加载指定classpath下class文件
3、工作的过程叫双亲委托模式,说白了就是加载的过程一层一层的委托找,首先是boostrap classloader,找不到,
交由extention classloader,找不到再委托给app classloader,默认的三个都找不到,看有没有自己实现的类加载器,都找不到的话,
程序会报classnofound异常。
那么问题来了,如果不同的类加载器加载类相同名字的类怎么办,或者说如何判定加载的类唯一呢!!!??
答案是必须满足两个条件:(1)类名一样 (2)类加载器一样,所以上面的问题加载是两个类,在程序中如果有这两个类的类型转换,赋值会报classcaseException
4、有可能程序要加载网络资源上的一些class类,这个需求就需要自己实现一个类加载器。
实现一个类加在器只要集成classloader类,实现其中的findlclass方法即可,方法里实现具体读取指定网络位置的class的过程。
其实web容器都有这些功能的类加载器,可以写个测试的servlet,打印出它自己调用的类加载器看看。
转载资源
http://www.importnew.com/15362.html