本文共 983 字,大约阅读时间需要 3 分钟。
1.类加载器是什么?
类加载器负责将.class文件加载到内存中,并生成Class对象.
2.类加载器是如何工作的?
在java中有三种类加载器 :
Bootstrap ClassLoader(根类加载器) : 负责加载java核心类库.
Extention ClassLoader(扩展类加载器) : 负责加载jre的扩展目录中的jar包.为java扩展的新功能可以通过这种方式加载.需要将扩展的jar包放置在JAVA_HOME/jre/lib/ext目录下.
System ClassLoader(系统类加载器) : 也就是应用类加载器.他负责加载来自java命令的-classpath选项,java.class.path系统属性或CLASSPATH环境变量的所指定的JAR包和类路径.使用ClassLoader.getSystemClassLoader()方法可以获取系统类加载器.一般的用户自定义类加载器的父加载器都是系统加载器.
JVM类加载机制:
1.全盘负责 : 一个类加载器加载某个Class时,该Class依赖的所有Class都有此类加载器加载.除非显示的改变类加载器;
2.父类委托 : 类记载器在加载Class时,首先请求父加载器加载,当父加载器无法加载时才尝试从自己的加载路径加载类.[ 为什么要由父加载器先加载?在JVM中同一个类只有一个Class,它是被全限定名和类加载器所标识的,两个不同的类加载器加载的同一个类文件,产生的Class是不兼容的.为了避免这种情况出现,JVM遵从父类委托的机制.因为该类有可能已经由父类加载了.例如加载一个引用了核心类库的自定义类. ]
3.缓存机制 : 保证所有被加载的类都被缓存,再次加载时,会检查缓存,只有当缓存中没有时才会加载.也就是说如果更改了Class,必须重启JVM;
加载器加载实例次序的父子关系图(子->父):
用户自定义类加载器->系统类加载器->扩展类加载器->根类加载器.
3.如何自定义类加载器?
自定义一个简单的类加载器只需要继承ClassLoader,并覆盖其中的findClass().如果想实现更复杂的功能,覆盖其他方法.
4.URLClassLoader继承了ClassLoader,也是系统类加载器和扩展类加载器的父类.它可以从文件系统,或者远程主机加载Class.
转载地址:http://ovvqj.baihongyu.com/