新建一个web项目然后新建一个servlet,在servet的doGet方法中我们循环的遍历出所有的类加载器(由低到高)
ClassLoader loader = this.getClass().getClassLoader();
while(loader != null){
out.println(loader.getClass().getName()+"<br>");
loader = loader.getParent();
}
接着将这个web项目部署到web应用服务器上(tomcat5.0),访问结果如下:
WebappClassLoader
StandardClassLoader
AppClassLoader
ExtClassLoader
好了,通过结果我们可以看出它是由WebappClassLoader加载器加载的,其上面还有四个类加载器,其中有三个是jdk提供的(BootStrap是内嵌在虚拟机中),下面我们就将servlet打成.Jar包放到我们的tomcat所用的jdk安装目录下的jre/lib/ext/下中让
ExtClassLoader去加载,以上操作完成后下面我们就再次访问这个servlet
结果出错了。http500错误!
下面我们分析一下出错原因:当ExtClassLoader加载该serlvet程序的时候,会首先根据类加载器的委派机制交给它的父亲(BootStrap)去加载,由于它父亲没有找到该类,所以就又交给它来加载,当他加载这个servlet的时候,他发现我们的这个servlet类extends HttpServlet所以它就又去加载httpservlet类,结果确没有找到,所以就报错了,因为这个jar包类是由tomcat提供的,因此我们需要拷贝httpservlet类到我们ext目录下,把tomcat lib中的servlet-api.jar拷贝到ext目录下面就可以解决这个问题了。
下面是关于分析原因图:
- 大小: 32 KB
分享到:
相关推荐
该模型规定除了顶层的启动类加载器外,其余的类加载器都应当有一个父类加载器。类的加载请求会首先传递给父类加载器处理,如果父类加载器无法处理,则交给子类加载器处理。这种机制有效地避免了子类加载器去重复加载...
ModRunJava 类加载器将这个功能进一步扩展,使得在运行时也能动态解决类的依赖关系,无需预先将所有依赖打包到一个大的可执行文件中。 使用ModRunJava 类加载器有以下几个主要优点: 1. **实时依赖解析**:当类...
然而,如果一个类加载器实例仍然存在,那么由它加载的所有类都不会被卸载,因为它们的类加载器引用链依然存在。因此,合理地管理和设计自定义类加载器是防止内存泄漏的关键。 在“Java类重新加载101对象类和类加载...
在实际应用中,类加载器有多种,包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。它们按照双亲委派模型工作,即子类加载器先尝试加载类,...
Java的类加载机制遵循“双亲委派模型”,这意味着当一个类加载器收到加载类的请求时,它会先委托给父类加载器,只有当父类加载器无法找到该类时,子类加载器才会尝试自己去加载。这种设计保证了核心库的稳定性和安全...
在实际应用中,单元测试与XML类加载器常常结合使用。例如,在Spring框架中,我们可以编写JUnit测试来验证通过XML配置创建的bean的行为。测试过程中,我们可以利用Spring的TestContext框架,它提供了一种方便的方式来...
Java的类加载器分为Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(应用程序类加载器)。自定义类加载器可以继承`java.lang.ClassLoader`,并覆盖`loadClass()`...
WebSphere应用服务器默认的类加载顺序是先从系统类加载器(System ClassLoader)开始,然后是扩展类加载器(Extension ClassLoader),最后是应用程序类加载器(Application ClassLoader)。这种机制可能导致应用中...
3. Application ClassLoader:应用类加载器,也称为系统类加载器,负责加载用户类路径(classpath)上的类。 二、类加载过程 类的加载过程包括三个主要步骤:加载、连接和初始化。 1. 加载:读取.class文件并生成...
显式加载也被称为类动态加载,它允许我们自定义类加载器加载任意类。 在自定义ClassLoader时,`java.lang.ClassLoader`是所有类加载器的基类。我们可以创建一个继承自ClassLoader的子类,重写其方法来实现特定的...
代码测试部分展示了如何通过`ClassLoader.getSystemClassLoader()`获取当前应用的类加载器,然后通过`getParent()`方法向上追溯到扩展类加载器和引导类加载器。由于引导类加载器是原生代码实现,没有对应的Java对象...
在Java中,类加载器是根据双亲委托模型工作的,即当一个类加载器收到加载类的请求时,它会先委托给父类加载器,只有当父类加载器无法找到对应的类时,才会尝试自己加载。在Tomcat中,WebappClassLoaderBase的父类...
- 修复引擎则是一个自定义的类加载器,它会优先加载补丁包中的类,若未找到则回退到系统默认的类加载流程。 3. **基于类加载机制的修复流程**: - 当应用启动时,修复引擎首先加载补丁包,将补丁中的类映射到内存...
3. **URLClassLoader**: 这是Java标准库中的一个类加载器,它可以从指定的URL加载类。通过创建`URLClassLoader`实例并传入包含源码或编译后类的目录或JAR文件的URL,可以在运行时加载新编译的类。 4. **反射...
- 双亲委派模型是指在类加载过程中,如果一个类加载器收到了类加载请求,它首先不会自己尝试去加载这个类,而是把类加载请求委托给父类加载器完成。只有父类加载器无法完成加载时,才会尝试自己加载。 2. **Spring...
这些类加载器允许我们在运行时加载不在原始 APK 中的类。对于.so文件,Android 提供了`System.loadLibrary()`方法,它会根据应用的`lib`目录加载相应的原生库。 3. **跨应用加载.so问题** 当试图从一个应用(AppA...
Java中的类加载器分为Bootstrap ClassLoader、Extension ClassLoader和AppClassClassLoader,以及用户自定义的类加载器。Bootstrap ClassLoader负责加载JDK核心库,Extension ClassLoader加载扩展库,而...
即当一个类被加载时,它会首先尝试由启动类加载器(Bootstrap ClassLoader)加载,如果该类不在启动类加载器的路径中,则会委托给扩展类加载器(Extension ClassLoader),再不行则继续委托给应用程序类加载器...
`ClassLoaderTest`是一个特定的测试用例,专注于如何有效地管理和关闭类加载器,以防止资源泄漏,特别是针对加载了基础jar文件的情况。当我们使用自定义的URLClassLoader时,尤其需要注意类加载器的生命周期管理,...