加入收藏 | 设为首页 | 会员中心 | 我要投稿 甘南站长网 (https://www.0941zz.com/)- 科技、行业物联网、开发、云计算、云管理!
当前位置: 首页 > 运营中心 > Tomcat > 正文

Tomcat Catalina为何不new出来原理解析

发布时间:2023-02-20 10:09:27 所属栏目:Tomcat 来源:互联网
导读:一、Catalina为什么不new出来? 掌握了Java的类加载器和双亲委派机制,现在我们就可以回答正题上来了,Tomcat的类加载器是怎么设计的? 1.Web容器的特性 Web容器有其自身的特殊性,所以在类加载器这块是不能完全使用JVM的类加载器的双亲委派机制的。在Web容器

                  if (i >= 0) {
                      try {
                          securityManager.checkPackageAccess(name.substring(0,i));
                      } catch (SecurityException se) {
                          String error = sm.getString("webappClassLoader.restrictedPackage", name);
                          log.info(error, se);
                          throw new ClassNotFoundException(error, se);
                      }
                  }
              }
              // 检查是否 设置了delegate属性,设置为true,那么就会完全按照JVM的"双亲委托"机制流程加载类。
              boolean delegateLoad = delegate || filter(name, true);
              // (1) Delegate to our parent if requested
              if (delegateLoad) {
                  if (log.isDebugEnabled()) {
                      log.debug("  Delegating to parent classloader1 " + parent);
                  }
                  try {
                      clazz = Class.forName(name, false, parent);
                      if (clazz != null) {
                          if (log.isDebugEnabled()) {
                              log.debug("  Loading class from parent");
                          }
                          if (resolve) {
                              resolveClass(clazz);
                          }
                          return clazz;
                      }
                  } catch (ClassNotFoundException e) {
                      // Ignore
                  }
              }
              // (2) Search local repositories
              // 若是没有委托,则默认会首次使用WebappClassLoader来加载类。通过自定义findClass定义处理类加载规则。
              // findClass()会去Web-INF/classes 目录下查找类。
              if (log.isDebugEnabled()) {
                  log.debug("  Searching local repositories");
              }
              try {
                  clazz = findClass(name);
                  if (clazz != null) {
                      if (log.isDebugEnabled()) {
                          log.debug("  Loading class from local repository");
                      }
                      if (resolve) {
                          resolveClass(clazz);
                      }
                      return clazz;
                  }
              } catch (ClassNotFoundException e) {
                  // Ignore
              }
              // (3) Delegate to parent unconditionally
              // 若是WebappClassLoader在/WEB-INF/classes、/WEB-INF/lib下还是查找不到class,
              // 那么无条件强制委托给System、Common类加载器去查找该类。
              if (!delegateLoad) {
                  if (log.isDebugEnabled()) {
                      log.debug("  Delegating to parent classloader at end: " + parent);
                  }

(编辑:甘南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读