注:本文管死不管埋,如不理解的相关部分请再自行百度
何为ClassLoader?
ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。
类加载流程
JVM自带三个类加载器:
- Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。
- Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
- Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。
简要解释:
- Bootstrap ClassLoader负责加载JAVA_HOME/lib下的核心jar包
- Extention ClassLoader负责加载JAVA_HOME/lib/ext下的jar包也称扩展包
- Appclass Loader负责加载当前项目下的classpath所有类
加载流程(双亲委派)
(盗图不会揍我吧,哈哈)
自定义ClassLoader
- 继承ClassLoader
- 重写findClass方法
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String fileName = getFileName(name);
File file = new File(mLibPath, fileName);
try {
FileInputStream is = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
try {
while ((len = is.read()) != -1) {
bos.write(len);
}
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = bos.toByteArray();
is.close();
bos.close();
/*要点:读取的class文件流,要调研此方法生成class对象*/
return defineClass(name, data, 0, data.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
使用场景
- 热部署
- 代码保护
- 加解密
- 包隔离(包冲突解决方案)
- 其它请自行脑补^_^
引用
参考以下资料
- http://blog.youkuaiyun.com/briblue/article/details/54973413
- http://blog.youkuaiyun.com/irelandken/article/details/7048817
- http://blog.youkuaiyun.com/xyang81/article/details/7292380
本文详细介绍了Java中类加载器的工作原理,包括BootstrapClassLoader、ExtentionClassLoader和AppclassLoader的作用及加载流程。同时,还提供了自定义ClassLoader的方法,并列举了几种常见的使用场景。
1万+

被折叠的 条评论
为什么被折叠?



