默认值
这个我还不知道怎么解析。。。
由于以上几个类加载器都是Launcher的内部类,具体我们可以查看Launcher源码,可以得到Bootstrap、Extension、App的加载路劲,我们可以通过一段代码来观察他们各自都负责加载哪些类
public static void main(String[] args) {
String bootClassPath = System.getProperty("sun.boot.class.path");
System.out.println(bootClassPath.replace(":", System.lineSeparator()));
System.out.println("------------------");
String extClassLoader = System.getProperty("java.ext.dirs");
System.out.println(extClassLoader.replace(":", System.lineSeparator()));
System.out.println("------------------");
String appClassLoader = System.getProperty("java.class.path");
System.out.println(appClassLoader.replace(":", System.lineSeparator()));
}
知识点:加载器其实不存在继承的父子关系,只有:谁的 类加载器 是谁,具体可以通过下面的代码来验证
public static void main(String[] args) {
Class<? extends C_1> myClass = new C_1("自定义类").getClass();
ClassLoader classLoader = myClass.getClassLoader();
System.out.println("自定义类的类加载器:" + classLoader);
ClassLoader classLoader1 = classLoader.getClass().getClassLoader();
System.out.println("自定义类的类加载器的 - 上层加载器:" + classLoader1);
}
/*
运行结果:
自定义类的类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
自定义类的类加载器的 - 上层加载器:null
*/
首先需要知道类加载器分为了4层既Bootstrap - Extension - App - CustomClassLoader,我们简称它为B-E-A-C,这四个加载器分别维护者自己的一块缓存
一个类被编程成字节码文件后,会先调用Custom.loadClass方法,把自己load进去,假如有自定义类加载器,先询问最底层的CustomClassLoader - C,如果这个加载器在内存中没有找到这个类,那么C会询问上层加载器App - A,A同样去自己维护的内存中找这个类,如果没找到,也会询问上层加载器Extension - E,同理E没找到会问Bootstrap - B,到达最顶层加载器还是没有找到这个类时,B会委托下层加载器加载这个类,但下层加载器会根据自己自己负责的领域进行加载,比如E负责加载ext中的拓展类,如果这个类不是拓展类,那E则会委托A去加载,依次类推,直到有一个加载器加载了这个类,或者没有任何一个加载器加载这个类,就会抛出ClassNotFoundException
源码过程:findInCache -> parent.loadClass -> findClass
就几个字:向上找向下委托
能干嘛?写框架、代码加密
怎么自定义?
1、extends ClassLoader
2、overwrite findClass() -> defineClass
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务