设为首页 加入收藏

TOP

谈谈 Java 类加载机制(二)
2018-11-21 14:08:42 】 浏览:313
Tags:谈谈 Java 加载 机制
= new URL[1]; URLStreamHandler streamHandler = null; File classPath = new File("/home/chen/Desktop/"); String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)) .toString(); urls[0] = new URL(null, repository, streamHandler); ClassLoader loader = new URLClassLoader(urls); Class testClass = loader.loadClass("Test"); // output: java.net.URLClassLoader@7f31245a System.out.println(testClass.getClassLoader()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

Tomcat 8.5.15类加载机制

Tomcat 使用正统的类加载机制(双亲委派),但部分地方做了改动。

  • Bootstrap classLoader 和 Extension classLoader 的作用不变。
  • System classLoader 正常情况下加载的是 CLASSPATH 下的类,但是 Tomcat 的启动脚本并未使用该变量,而是从以下仓库下加载类:
  1. $CATALINA_HOME/bin/bootstrap.jar 包含了 Tomcat 的启动类。在该启动类中创建了 Common classLoaderCatalina classLoadershared classLoader。因为 $CATALINA_BASE/conf/catalina.properties 中只对 common.loader 属性做了定义,server.loader 和 shared.loader 属性为空,所以默认情况下,这三个 classLoader 都是 CommonLoader。具体的代码逻辑可以查阅 org.apache.catalina.startup.Bootstrap 类的 initClassLoaders() 方法和 createClassLoader() 方法。
  2. $CATALINA_BASE/bin/tomcat-juli.jar 包含了 Tomcat 日志模块所需要的实现类。
  3. $CATALINA_HOME/bin/commons-daemon.jar。
  • Common classLoader 是位于 Tomcat 应用服务器顶层的公用类加载器。由其加载的类可以由 Tomcat 自身类和所有应用程序使用。扫描路径由 $CATALINA_BASE/conf/catalina.properties 文件中的 common.loader 属性定义。默认是 $CATALINA_HOME/lib。
  • catalina classLoader 用于加载服务器内部可见类,这些类应用程序不能访问。
  • shared classLoader 用于加载应用程序共享类,这些类服务器不会依赖。
  • Webapp classLoader 。每个应用程序都会有一个独一无二的 webapp classloader,他用来加载本应用程序 /WEB-INF/classes 和 /WEB-INF/lib 下的类。

特别的:

Webapp classLoader 的默认行为会与正常的双亲委派模式不同:

  1. 从 Bootstrap classloader 加载。
  2. 若没有,从 /WEB-INF/classes 加载。
  3. 若没有,从 /WEB-INF/lib/*.jar 加载。
  4. 若没有,则依次从 SystemCommonshared 加载(该步骤使用双亲委派)。

当然了,我们也可以通过配置来使 Webapp classLoader 严格按照双亲委派模式加载类:

  1. 通过在工程的 META-INF/context.xml(和 WEB-INF/classes 在同一目录下) 配置文件中添加 <Loader delegate="true"/>
  2. 因为 Webapp classLoader 的实现类是 org.apache.catalina.loader.WebappLoader,他有一个属性叫 delegate, 用来控制类加载器的加载行为,默认为 false,我们可以使用 set 方法,将其设为 true 来启用严格双亲委派加载模式。

严格双亲委派模式加载步骤:

  1. 从 Bootstrap classloader 加载。
  2. 若没有,则依次从 SystemCommonshared 加载。
  3. 若没有,从 /WEB-INF/classes 加载。
  4. 若没有,从 /WEB-INF/lib/*.jar 加载。

参考资料

  1. The Java Class Loading Mechanism
  2. Java Classloader
  3. Class Loader HOW-TO – Apache Tomcat 8
  4. 《Tomcat 架构解析》
  5. 《深入理解 Java 虚拟机》
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SpringBoot系列一:SpringBoot入门 下一篇FutureTask在线程池中应用和源码..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目