众所周知,Java的类加载机制采用了双亲委派模型,导致在进行类加载的时候会有多个加载器,这种复杂的机制,有时候会导致‘Exception in thread main java.lang.NoClassDefFoundError’这个异常,虽然可能你认为相应的类和jar包就在某个类加载器中.下面的文字,会试图尝试解释为什么会发生这种情况.   下面提供了一个简单的java程序来帮助理解问题的发生.    默认的JVM的类加载委派模型   默认的类加载委派模式是从下向上的,也就是双亲委派.这意味着…
实际上,在Java应用中所有程序都运行在线程里,如果在程序中没有手工设置过ClassLoader,对于一般的java类如下两种方法获得的ClassLoader通常都是同一个 this.getClass.getClassLoader(): Thread.currentThread().getContextClassLoader(): 方法一得到的Classloader是静态的,表明类的载入者是谁: 方法二得到的Classloader是动态的,谁执行(某个线程),就是那个执行者的Classloade…
关于tomcat和classloader的文章,网上多如牛毛,且互相转载,所以大多数搜到的基本上是讲到了tomcat中classloader的几个层次,对于初接触classloader,看了之后还是只知其然不知其所以然. 一直比较好奇,为什么tomcat需要实现自己的classloader,jvm提供的classloader有什么不符合需要? 事实上,tomcat之所以造了一堆自己的classloader,大致是出于下面三类目的: 对于各个webapp中的class和lib,需要相互隔离,不能出…
定义 同其他服务器应用一样,tomcat安装了各种classloader(classes that implement java.lang.ClassLoader) Bootstrap | System | Common / \ Catalina Shared / \ Webapp1 Webapp2 ... / / Jasper1 Jasper2 Bootstrap: contains the basic runtime classes provided by the Java Virtual…
关于tomcat的classloader相关的帖子网上非常多,我觉得比较好的有: https://www.jianshu.com/p/d90e4430b0b9 https://blog.csdn.net/qq_38182963/article/details/78660779 但是看了很多文章都说tomcat违反了双亲委派模型,可以是通过源码以及一些概念包括tomcat的delegate的设置描述并没有觉得tomcat是因为违反了双亲委派模型才实现多个应用的classpath隔离. 个人觉得:…
本系列博客打算分析一下tomcat7.x的源码,其中可能会穿插一些java基础知识的介绍  读tomcat的源码的时候,我建议和官方的User Guide一起阅读,明白tomcat做某件事情的目的之后,看源码会容易一点.另外,debug当然是一个非常重要的工具.源码上了规模之后,如果单纯静态地看,基本是看不出什么来的,但是跟着数据流走一走,很多问题就清楚了  debug环境的搭建方法,请看另外一篇博客:http://zhh2009.iteye.com/blog/1557891.这篇文章写得很清楚…
查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader().而我们后面的WEB程序,里面的jar.resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar.资源文件的时候,首先应该是使用Thread.currentThread…
一.正文: 有去看开源框架的童鞋,应该会经常看到如下代码:Thread.currentThread().getContextClassLoader().loadClass(className),那这个和Class.forName(className)有什么区别? 带着这个问题,笔者查了一些资料,现整理分享如下,如果不当之处还望斧正: 通常情况下,一个JVM中的所有类加载器被组织成一个层次结构,使得每一个类加载器(除了启动整个JVM的原始类加载器)都有一个父加载器.当被要求加载一个类时,每一个类加…
查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader().而我们后面的WEB程序,里面的jar.resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar.资源文件的时候,首先应该是使用Thread.currentThread…
Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第二个参数(bool)表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量. C…