加入收藏 | 设为首页 | 会员中心 | 我要投稿 甘南站长网 (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 (clazz != null) {
                  if (log.isDebugEnabled()) {
                      log.debug("  Returning class from cache");
                  }
                  if (resolve) {
                      resolveClass(clazz);
                  }
                  return clazz;
              }
              // (0.2) Try loading the class with the bootstrap class loader, to prevent
              //       the webapp from overriding Java SE classes. This implements
              //       SRV.10.7.2
              // 如果前两步都没有找到,则使用系统类加载该类(也就是当前JVM的ClassPath)。
              // 为了防止覆盖基础类实现,这里会判断class是不是JVMSE中的基础类库中类。
              String resourceName = binaryNameToPath(name, false);
              ClassLoader javaseLoader = getJavaseClassLoader();
              boolean tryLoadingFromJavaseLoader;
              try {
                  // Use getResource as it won't trigger an expensive
                  // ClassNotFoundException if the resource is not available from
                  // the Java SE class loader. However (see
                  // https://bz.apache.org/bugzilla/show_bug.cgi?id=58125 for
                  // details) when running under a security manager in rare cases
                  // this call may trigger a ClassCircularityError.
                  // See https://bz.apache.org/bugzilla/show_bug.cgi?id=61424 for
                  // details of how this may trigger a StackOverflowError
                  // Given these reported errors, catch Throwable to ensure any
                  // other edge cases are also caught
                  URL url;
                  if (securityManager != null) {
                      PrivilegedAction<URL> dp = new PrivilegedJavaseGetResource(resourceName);
                      url = AccessController.doPrivileged(dp);
                  } else {
                      url = javaseLoader.getResource(resourceName);
                  }
                  tryLoadingFromJavaseLoader = (url != null);
              } catch (Throwable t) {
                  // Swallow all exceptions apart from those that must be re-thrown
                  ExceptionUtils.handleThrowable(t);
                  // The getResource() trick won't work for this class. We have to
                  // try loading it directly and accept that we might get a
                  // ClassNotFoundException.
                  tryLoadingFromJavaseLoader = true;
              }
              if (tryLoadingFromJavaseLoader) {
                  try {
                      clazz = javaseLoader.loadClass(name);
                      if (clazz != null) {
                          if (resolve) {
                              resolveClass(clazz);
                          }
                          return clazz;
                      }
                  } catch (ClassNotFoundException e) {
                      // Ignore
                  }
              }
              // (0.5) Permission to access this class when using a SecurityManager
              if (securityManager != null) {
                  int i = name.lastIndexOf('.');

(编辑:甘南站长网)

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

推荐文章
    热点阅读