类加载器的补充
一 类加载器的结构
二 类加载器的源码
-
ClassLoader: 类加载器的基础实现,双亲委派就是这里实现的
-
SecureClassLoader: 安全相关的类加载器
-
URLClassLoader:类加载器用于从同时引用JAR文件和目录的URL的搜索路径加载类和资源: 安全相关的类加载器
-
AppClassLoader: Java应用的基础类加载器,自定义的类加载器如果不指定Parent,那么Parent就默认为这个。
-
WebappClassLoaderBase: 专门的Web应用程序类加载器。 该类加载器是JDK中URLClassLoader的完全重新实现。 尽管它的内部行为可能完全不同,但它设计为与常规URLClassLoader完全兼容。
-
实施说明-默认情况下,此类加载器遵循规范要求的委托模型。 首先将查询系统类加载器,然后是本地存储库,然后才进行向父类加载器的委派。 这允许Web应用程序覆盖除J2SE中的类之外的任何共享类。 JAXP XML解析器接口,JNDI接口和Servlet API中的类提供了特殊处理,这些从未从webapp存储库中加载。 delegate属性允许应用程序修改此行为,以将父类加载器移到本地存储库之前。
-
实施说明-由于Jasper编译技术的限制,类加载器将忽略包含Servlet API中的类的任何存储库。
-
实施说明-类加载器会在从JAR文件加载类时生成包含完整JAR URL的源URL,即使在类包含在JAR中时,也允许在类级别设置安全权限。
-
实施注意事项-按照通过初始构造函数添加本地存储库的顺序搜索本地存储库。
-
实施说明-除非有安全管理人员,否则不检查密封违规或安全性。
-
实施说明-从8.0开始,此类加载器实现InstrumentableClassLoader ,从而允许Web应用程序类对同一Web应用程序中的其他类进行检测。 它不允许检测系统或容器类或其他Web应用程序中的类
-
-
ParallelWebappClassLoader: 并行Webapp类加载器
-
WebappClassLoader: Webapp类加载器
三 Web应用启动时的类加载器初始化
-
启动Context StandardContext.startInternal();
-
获取Loader(类加载器的包装类)loader = getLoader() == null?new WebappLoader():null;
-
获取Web应用的类加载器包装类 Loader loader = getLoader();
-
启动Loader(类加载器包装类) ((Lifecycle) loader).start();
-
WebappLoader.startInternal();
-
创建类加载器(WebappClassLoaderBase) classLoader = createClassLoader();
-
启动类加载器 classLoader.start(); WebappClassLoaderBase实现的Lifecycle
-
绑定类加载器 oldCCL = bindThread(); → Thread.currentThread().setContextClassLoader(webApplicationClassLoader);
-