Classloader之豁然开朗

类加载器功用

  • 以前看Tomcat类加载器,云里雾里,后来再战类加载仍是不理解到底干什么的
  • 忽然就想到了,Tomcat下可能会出现多个同名的class文件,怎么保证不冲突,而且各自代码运行各自的class呢,嗯,类加载器
  1. 动态加载类
  2. 等等等,目前用不到的功能,加密....
  • 举例,加载同名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

  1. Classloader.loadClass 实现了双亲委派的机制,若是要自定加载机制可重写
  2. Classloader.findClass 用来给开发者重写自定加载class文件的方法,可自定
  3. Classloader.defineClass 接受class的字节数据,返回class,native方法安安生生的用吧

双亲委派工做原理

双亲委派模式优点

  • 虽然没用过,可是理解了,摘抄。采用双亲委派模式的是好处是Java类随着它的类加载器一块儿具有了一种带有优先级的层次关系,经过这种层级关能够避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换
相关文章
相关标签/搜索