/**
* BootStrap jre/lib/rt.jar
* ExtClassLoader jre/lib/ext/*.jar
* AppClassLoader classpath指定的所有jar
*
* 1. 先用当前线程的类加载器去加载字节码
* 2. 如果A引用了B,加载B就用A的加载器
*
* 类加载器的委托机制,先让父加载器去加载:从而可以保证同一个类在内存中只有一份字节码。
* 1. 发起者先让父加载器去找
* 2. 如果父加载器找不到,依次从上到下,到发起者
* 3. 如果还找不到,就抛异常
*
类加载器采用cache机制,如果cache中保存了这个
Class就直接返回它,如果没有才从文件中读取和转换
成Class,并存入cache,这就是为什么修改了Class必须重启JVM才能生效、且类只能加载一次的原因。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB96E.tmp.jpg * 高级问题:tomcat的web项目
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
ClassLoader loader = this.getClass().getClassLoader();
while(loader != null){
out.println(loader.getClass().getName()+”<br/>”);
loader = loader.getParent();
}
out.close();
输出结果:
WebAppClassLoader
StandardClassLoader
AppClassLoader
ExtClassLoader
*
* 配置文件
* web项目中获取:getRealPath();
* 类加载器获取:
* Demo.class.getClassLoader().getResource("").getPath(); //相对于根路径
* Demo.class.getResource("").getPath(); //相对于包
*
* 自定义类加载器
* 模板方法设计模式
*/