- 类加载的步骤
**加载、验证、准备、解析、初始化、**使用、卸载
注:加粗部分为类加载步骤 - 双亲委派机制简述
一个新类的加载 会先有 Appliction ClasLoader(应用程序类加载器) 询问父类 Extension ClassLoader (扩展类加载器)再询问 BootStrp ClassLoader( 启动类类加载器)然后由 BootStrp ClassLoader( 启动类类加载器) 反馈能否加载,如果能就加载,如果不能就由Extension ClassLoader (扩展类加载器)反馈能否加载 ,如果能就加载,如果不能就由 Appliction ClasLoader(应用程序类加载器) 反馈加载 如果能就加载,如果不能就由用户加载器加载。
简述是:逐级向上问 逐级向下用 向上问到头 向下用到能
- 双亲委派机制的好处(作用)
保证了java核心类的安全 防止了用户恶意篡改java的核心类
- 自定义的ClassLoader
- 继承ClassLoader
- 覆盖finderClass方法
自定义类加载器案例
import java.io.*;
public class MyClassLoader extends ClassLoader {
private String dir;
public MyClassLoader(String dir){
this.dir = dir;
}
public MyClassLoader(String dir,ClassLoader parent){
super(parent);
this.dir = dir;
}
protected Class<?> findClass(String name)throws ClassNotFoundException{
try {
String file = dir+ File.separator+name.replace(".",File.separator)+".class";
InputStream in = new FileInputStream(file);
ByteArrayOutputStream byteArrayInputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len = -1;
while ((len=in.read(buf))!=-1){
byteArrayInputStream.write(buf,0,len);
}
byte data[] = byteArrayInputStream.toByteArray();
in.close();
byteArrayInputStream.close();
return defineClass(name,data,0,data.length);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}