首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Apache tomcat的Bootstrap类调用ClassLoader.loadclass而不是new操作符?

Apache Tomcat的Bootstrap类调用ClassLoader.loadClass而不是new操作符的原因是为了实现类的动态加载和隔离。

ClassLoader.loadClass方法可以根据类的全限定名动态加载类,并将其加载到JVM中。这种动态加载的方式使得Tomcat可以根据需要加载和卸载不同的类,实现了类的动态扩展和更新。同时,ClassLoader还可以实现类的隔离,即不同的Web应用程序可以使用不同的ClassLoader加载自己的类,避免类之间的冲突和干扰。

相比之下,使用new操作符创建对象是静态的,需要在编译时确定类的类型,并且需要在编译时将类的字节码文件包含在应用程序中。这种静态加载的方式不利于类的动态扩展和更新,也无法实现类的隔离。

总结起来,Apache Tomcat的Bootstrap类调用ClassLoader.loadClass而不是new操作符,是为了实现类的动态加载和隔离,以满足Tomcat作为Web服务器的灵活性和可扩展性的需求。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云容器服务(TKE)。

腾讯云云服务器(CVM)是一种可弹性伸缩的云服务器,提供高性能、高可靠性的计算能力,适用于各种应用场景。您可以根据实际需求选择不同配置的云服务器,并根据业务负载自动调整服务器数量,实现弹性扩展。

腾讯云容器服务(TKE)是一种基于Kubernetes的容器管理服务,提供高度可扩展的容器集群,支持自动化部署、弹性伸缩和故障恢复。您可以使用TKE来管理和运行容器化的应用程序,实现快速部署和弹性扩展。

更多关于腾讯云云服务器和腾讯云容器服务的详细信息,请访问以下链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

fastjson-BCEL不出网打法原理分析

就在set方法里面: 1.调用set方法dataSourceName: 2.调用setAutoCommit方法:为什么是true?...com.sun.org.apache.bcel.internal.util里面有一个classLoader,ClassLoader里面有一个 loadClass方法,如果满足方法里面的条件就可以动态调用恶意代码...代码很简单,创建一个对象然后调用loadClass方法,需要注意为什么我们需要做编码这一步:String code = Utility.encode(bytes,true); 我们在调用loadClass...tomcat-dbcp: 结合tomcat-dbcp这个进行组合达到触发fastjson目的: tomcat-dbcp里面有一个BasicDataSource,在反序列化时候会调用getConnection...classLoader = new ClassLoader(); classLoader.loadClass("$$BCEL$$"+code).newInstance(); 通过动态加载调用我们

1.2K10
  • JDK源码级别彻底剖析加载机制

    注意,主在运行过程中如果使用到其它,会逐步加载这些。 jar包或war包里不是一次性全部加载,是使用到时才加载。...如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加 载器加载(即调用parent.loadClass(name, false);).或者是调用bootstrap加载器来加 载...如果父加载器及bootstrap加载器都没有找到指定,那么调用当前加载器 findClass方法来完成加载。...再看看我们问题:Tomcat 如果使用默认双亲委派加载机制行不行? 答案是不行为什么?...很显然,tomcat 不是这样实现,tomcat 为了实现隔离性,没有遵守这个约定,每个 webappClassLoader加载自己目录下class文件,不会传递给父加载器,打破了双亲委派机制。

    40610

    Tomcat - 模拟TomcatwebappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离

    源码详见: org.apache.jasper.servlet.JasperLoader ---- Tomcat违反了双亲委派机制?...JVM内, 分别使用不同加载器(new 出来)去加载不同classpath下避免了走双亲委派,去模拟tomcat加载机制 通过结论可以得出在同一个JVM内,两个相同包名和对象可以共存...当tomcat启动时,会创建几种类加载器: Bootstrap 引导加载器 : 加载JVM启动所需,以及标准扩展(位于jre/lib/ext下) System 系统加载器 : 加载tomcat...启动,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。...---- 总之 当应用需要到某个时,则会按照下面的顺序进行加载: 1 使用bootstrap引导加载器加载 (JVM 东西 ) 2 使用system系统加载器加载 (tomcat启动Bootstrap

    97320

    谈谈加载器双亲委派机制

    几点思考 Java虚拟机第一个加载器是Bootstrap,这个加载器很特殊,它不是Java,因此它不需要被别人加载,它嵌套在Java虚拟机内核里面,也就是JVM启动时候Bootstrap就已经启动...这也是我们在测试时为什么发现System.class.getClassLoader()结果为null原因,这并不表示System这个没有加载器,而是它加载器比较特殊,是BootstrapClassLoader...,由于它不是Java,因此获得它引用肯定返回null。...如果类A中引用了B,Java虚拟机将使用加载A加载器去加载B。 还可以直接调用ClassLoader.loadClass()方法来指定某个加载器去加载某个。...即可不需要重新加载,这样内存中就只有一份System字节码了。

    69200

    4.自定义加载器实现及在tomcat应用

    分析自定义加载为什么是appClassLoader?...根据双亲委派机制, 我们知道, 他一定是被应用程序加载器AppClassLoader加载, 不是我们自定义加载器, 为什么呢? 因为他要向上寻找, 向下委托....我们要打破双亲委派机制, 就是要让自定义加载器来加载我们User1.class, 不是应用程序加载器来加载 双亲委派机制是在ClassLoaderloadClass(...)方法实现....所以, tomcat需要打破双亲委派机制。不同war包下自己加载,不向上委托。基础依然向上委托。 2.tomcat是如何打破双亲委派机制?...黄色部分是tomcat第一部分自定义加载器, 这部分主要是加载tomcat包中, 这一部分依然采用是双亲委派机制, 绿色部分是tomcat第二部分自定义加载器, 正事这一部分, 打破了双亲委派机制

    1.3K30

    从零开始手写Tomcat教程4节---Tomcat默认连接器

    解析连接 解析请求 解析头部 总结 ---- Tomcat默认连接器 本节我们来分析一下tomcat 4中默认连接器源码 Tomcat 1-3节 注意: 本节所讲连接器是指Tomcat 4中默认连接器...必须创建响应对象,该响应对象必须实现接口 org.apache.catalina.Response。 Tomcat4 默认连接器类似于上节简单连接器。...交给得到处理器实例中 } } ---- HttpProcessor 看一下recycle方法: 注意:连接器拥有处理器池所有权,不是处理器自己拥有,因此上面调用是...疑问: 为什么 await 需要使用一个本地变量(socket)不是返回实例 socket 变量呢?...注意是,这样对比是基于两个字符数组之间,不是两个字符串之间

    84910

    双亲委派模型:大厂高频面试题,轻松搞定

    第一次加载class文件时调用,包括静态变量初始化语句和静态块执行 : 在实例创建出来时候调用,包括调用new操作符调用 Class 或 Java.lang.reflect.Constructor...我们发现除了启动加载器(BootStrap ClassLoader),每个都有其"父"加载器 ⚠️ 其实这里父子关系是组合模式,不是继承关系来实现 ?...加载器责任范围 上面我们提到每个加载器都有对应加载搜索范围 Bootstrap ClassLoader:这个加载器不是一个Java,而是由底层c++实现,负责在虚拟机启动时加载Jdk核心库(如...ClassLoader.loadClass方式 如果采用这种方式加载策略,由于双亲托管模型存在,最终都会将加载任务交付给Bootstrap ClassLoader进行加载。...综上所述,ClassLoader.loadClass 如果调用成功会: 会被加载到内存中; 不会被初始化,只有在之后被第一次调用才会被初始化; 之所以采用这种方式加载,是提供一种灵活度,可以根据自身需求继承

    61721

    探秘Tomcat——启动篇

    1.启动入口   在代码中,tomcat启动是通过运行org.apache.catalina.startup.Bootstrapmain方法来启动服务 public static void main...\Desktop\tomcat\apache-tomcat-6.0.43-src\output\build"这样参数,具体操作参见《探秘Tomcat(一)——Myeclipse中导入Tomcat源码》...return classLoader; } 这里有个小细节在createClassLoader方法中有调用方法getCatalinaBase,getCatalinaBase又会去调用getCatalinaHome...,不是将getCatalinaHome中具体功能代码又冗余写一遍,这是一个很好习惯^_^ 至此,我们完成了Bootstrap对象初始化,为catalina.home等,初始化了三个加载器。...至此,就完成了 Bootstrap初始化 加载server服务 启动server服务 最终实现了启动tomcat目的,其实现在回头来看,启动一个服务器无非就是启动了一个server^^ 如果您觉得阅读本文对您有帮助

    2.1K70

    Tomcat】《How Tomcat Works》英文版GPT翻译(第四章)

    默认连接器还使用了一些在第三章连接器中未使用优化。 首先,它提供了一个对象池,以避免代价昂贵对象创建操作。 其次,在许多地方,它使用字符数组不是字符串。...一个重要注意事项是,assign 方法必须立即返回,不是等待HttpProcessor完成解析,以便可以处理下一个传入HTTP请求。...(socket),不是返回实例socket变量?...需要注意是,SocketInputStream 构造函数也从连接器传递了缓冲区大小,不是从 HttpProcessor 局部变量传递。...Bootstrap 主要方法构造了org.apache.catalina.connector.http.HttpConnector实例和一个SimpleContainer实例。

    16310

    Tomcat】《How Tomcat Works》英文版GPT翻译(第八章)

    一个servlet只被允许加载WEB-INF/classes目录及其子目录中以及部署到WEB-INF/lib目录中库。 这就是为什么servlet容器需要自己加载器。...Tomcat加载器表示一个Web应用程序加载器,不是一个加载器。 加载器必须实现org.apache.catalina.Loader接口。...如果 modified 方法返回 true,则 WebappLoader 实例通知其关联容器(在本例中为上下文)。 重新加载由 Context 执行,不是 WebappLoader 。...该方法由 StandardContext org.apache.catalina.core.ContainerBase 专用线程定期调用。...它还缓存了未能找到名称,这样下次请求加载相同时,加载器可以直接抛出ClassNotFoundException不是先尝试查找它们。

    14310

    JVM 加载过程解析

    其中验证、准备、解析为连接 被主动加载 7 种情况 创建实例, 比如:new Object(); 访问某个或接口静态变量,或者对该静态变量赋值; 调用静态方法; 反射(如 Class.forName...调用 ClassLoader loadClass 方法加载一,并不是主动使用,不会导致初始化。...加载 在硬盘上查找并且通过 IO 读入字节码文件,使用到该类时候才会被加载,例如调用 main 方法, new 关键字调用对象等,在加载阶段会在内存中生成这个 java.lang.Class 对象...答案是: 违背了 tomcat不是这样实现, tomcat为了实现隔离性, 没有遵守这个约定, 每个 webapp Loader加载自己目录下 class'文件,不会传递给父加载器,打破了双亲委派机制...参考资料 《深入理解 Java 虚拟机》 第三版 周志明 Apache Tomcat Documentation

    49831

    Tomcat】《How Tomcat Works》英文版GPT翻译(第十章)

    因此,AuthenticatorBase invoke 方法会调用抽象方法 authenticate, authenticate 实现取决于子类,这并不奇怪。...该身份验证方法由身份验证器调用。 如果作为参数传递用户名和密码用户不是有效用户,该方法将返回空值。 否则,它将返回一个代表该用户 Principal 对象。...Bootstrap1 启动了本章第一个应用程序。它在清单 10.4 中给出。...Bootstrap1主方法创建了两个 SimpleWrapper 对象,并调用它们 setName 和 setServletClass 方法。...Bootstrap2 启动第二个应用程序。这个与B ootstrap1 相似,只是它使用一个 SimpleUserDatabase 实例作为与 StandardContext 相关联域。

    18110
    领券