类加载器功用
- 以前看Tomcat类加载器,云里雾里,后来再战类加载仍是不理解到底干什么的
- 忽然就想到了,Tomcat下可能会出现多个同名的class文件,怎么保证不冲突,而且各自代码运行各自的class呢,嗯,类加载器
- 动态加载类
- 等等等,目前用不到的功能,加密....
- 举例,加载同名class,但各自运行不冲突。
- 以下,两个自定的classloader加载同名class运行在JVM中
public class V extends Date{
public String toString() {
//另外一个同名class是version2
return "version1";
}
}
public class ClTest {
public static void main(String[] args) throws Exception {
ClassLoader c1 = new ClassLoader(){
@Override
protected Class findClass(String name) throws ClassNotFoundException {
String path = "D:\\classloader\\V.class";
byte[] classBytes = new byte[0];
try {
classBytes = Files.readAllBytes(new File(path).toPath());
} catch (Exception e) {
}
Class c = this.defineClass(name, classBytes, 0, classBytes.length);
return c;
}
};
ClassLoader c2 = new ClassLoader(){
@Override
protected Class findClass(String name) throws ClassNotFoundException {
String path = "D:\\classloader\\version2\\V.class";
byte[] classBytes = null;
try {
classBytes = Files.readAllBytes(new File(path).toPath());
} catch (Exception e) {
}
Class c = this.defineClass(name, classBytes, 0, classBytes.length);
return c;
}
};
Class v = Class.forName("V", true, c1);
Date o = (Date) v.newInstance();
Class v2 = Class.forName("V", true, c2);
Date o2 = (Date) v2.newInstance();
System.out.println(new String(o.toString().getBytes(),"UTF-8"));
System.out.println(new String(o2.toString().getBytes(),"UTF-8"));
System.out.println(o.equals(o2));
}
}

自定义Classloader
- Classloader.loadClass 实现了双亲委派的机制,若是要自定加载机制可重写
- Classloader.findClass 用来给开发者重写自定加载class文件的方法,可自定
- Classloader.defineClass 接受class的字节数据,返回class,native方法安安生生的用吧
双亲委派工做原理
双亲委派模式优点
- 虽然没用过,可是理解了,摘抄。采用双亲委派模式的是好处是Java类随着它的类加载器一块儿具有了一种带有优先级的层次关系,经过这种层级关能够避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换