|
一、类加载器(一)file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB95D.tmp.jpg类加载器ClassLoader /** * 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(); //相对于包 * * 自定义类加载器 * 模板方法设计模式 */
|