首页
学习
活动
专区
工具
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(); 通过动态加载调用我们

94010

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

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

37710

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

87920

谈谈加载器双亲委派机制

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

68500

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 变量呢?...注意是,这样对比是基于两个字符数组之间,不是两个字符串之间

80910

探秘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实例。

13610

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

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

59821

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不是先尝试查找它们。

12910

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

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

15810

JVM 加载过程解析

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

48131
领券