java的类加载器和Tomcat的类加载器

原创 2018年04月15日 19:51:27
java的类加载器

    1.什么是类加载器:

            所谓类加载器就是把.class文件加载到jvm的方法区内,变成一个Class对象 。

    2.类加载器的作用:

            首先说明,类加载器是每一个类在创建的时候都会使用的一个“引路人”,它把.class文件“指引到”jvm的方法区 ,变成一个Class对象,然后进行使用,也可以这么说,类加载器就是jvm的一个左膀右臂或者是“小兵”。

    3.类加载的名称:

            ClassLoader

    4.创建对象的具体过程

        ClassLoader把.class文件读入内存的方法区,并且执行静态代码块和静态初始化语句------>执行new,在堆内存中创建一个空白对象-------->调用构造器和子类调用父类构造器--------->执行构造器内的逻辑并且为非静态成员变量赋初值,

    5.类加载器的分类:

        java虚拟机一共分成三类,每一类都有自己的职能,但是有“范围”和“权力”的大小

        从大到小依次是:引导:专门负责加载\jdk1.7.0_80\jre\lib\rt.jar,下的类

                                   扩展类加载器:专门负责扩展的类加载器

                                   系统类加载:专门负责classpath下的类也就是项目下的\bin,这个包括项目下的.class,程序员自己写的类,以及第三方jar

    6.如何获得类加载器:

        在Class类里有一个getClassLoader()方法,可以获取类加载器。

    7.类加载器的委托机制:

        当程序员在new一个类的时候系统类加载器就会去加载这个类------>但是此时它并不会马上加载而是先去询问扩展类记载器是否可以加载------->同样扩展类加载器也不会马上加载而是回去询问引导能问加载------->如果引导在rt.jar下找到了相关.class文件,那么就会加载这个文件并返回此对象-------->如果引导没有找到那么就会返回null,通知扩展类加载器去加载----->同样的道理,如果扩展类加载器有次文件,那么加载并返回对象-------->否则返回null----------->此时轮到系统类加载器加载文件,发现有此文件,那么会生成此对象------->如果没有那么就会抛出异常ClassNotFoundException

    8.类加载器的委托机制的好处:

        有人会问,类加载的委托机制这么复杂,为什么还要用呢?答案就是为了安全,试想一下,如果系统类记载器直接就找到并加载这个类,那么是否一个居心叵测的人写了一个和jdk里面同名的类型比如String ,是不是就会加载这个类型,而不去加载rt.jar下的类型了呢,而此时jvm内很多方法都依赖String类型,是不是也就不能用了呢。所以这种方式可以保证类加载的绝对安全!!!

    9.类加载器解析类的过程:

public class Tset {//由系统类加载加载
	public static void main(String[] args) {
		Demo d = new Demo();//由系统类加载器加载
		String a =new String("aaa");//由系统类加载器加载
	}
}
class Demo{
	
}

    类内部的对象由那个类加载器加载取决于这个对象所在的类由那个类加载器加载。

Tomcat的类加载器
                            

            Tomcat提供了两个类加载器,所以在javaweb项目的时候导入第三方jar的时候,导入到web项目的WEB-INF/lib就可以,

        这两个累加器分别是:

                    * 服务器类加载器:负责加载${CATALINA_HOME}\lib下面的类!

                  * 应用类加载器:负责加载${CONTEXT_HOME}\WEB-INF\lib、${CONTEXT_HOME}\WEB-INF\classes,这两个路径下的类!

        总体顺序排序

                      引导
                      扩展扩展类加载器
                      系统类类加载器
                      服务器类加载器
                      应用类加载器:

          但是这两个类加载器有一个特点,就是不具备委托机制,所以在做javaweb项目的时候一定不要把  ${CONTEXT_HOME}\WEB-INF\lib下的jar放到${CATALINA_HOME}\lib



            

版权声明:本文为博主原创文章,未经博主允许不得转载。 如果转载,需要获得作者授权。保留追究法律责任的权力 https://blog.csdn.net/swf_shixinshou/article/details/79951838

Java类加载机制与Tomcat类加载器架构

Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这...
  • fuzhongmin05
  • fuzhongmin05
  • 2017-02-26 10:58:11
  • 2836

类加载器内存泄露与tomcat自定义加载器

类加载器如何发生内存泄露,以及Tomcat与类加载器有关的源代码,分析了Tomcat的启动流程...
  • u010723709
  • u010723709
  • 2015-12-14 10:59:13
  • 2306

类加载器与Tomcat

  • 2010年08月16日 00:48
  • 60KB
  • 下载

Tomcat类加载器机制(Tomcat源码解析六)

要说Tomcat的Classloader机制,我们还得从Bootstrap开始。在BootStrap初始化的时候,调用了org.apache.catalina.startup.Bootstrap#in...
  • jiaomingliang
  • jiaomingliang
  • 2015-08-11 10:28:48
  • 3406

tomcat与OSGI:类加载器

Tomcat:正统的类加载架构。 通常的Java Web服务器都实现了自己的类加载器(一般不止一个)。 正常的Web服务器要解决如下几个问题: (1)部署在一个服务器上的两个Web应用程序所使用...
  • pq258280920
  • pq258280920
  • 2014-05-28 15:50:09
  • 1019

Tomcat类加载器(附JVM类加载器简介)

Tomcat类加载器(附JVM类加载器简介)          学习tomcat类加载器,首先得先看下JVM提供了几种类加载器,毕竟tomcat类加载器是依赖于JVM类加载器的。         ...
  • lantian0802
  • lantian0802
  • 2013-04-13 17:56:22
  • 2031

TomCat类加载器结构

一个功能健全的类加载器,都要解决以下几个问题: (1)部署在同一服务器上的两个web应用程序所使用的java类库可以实现相互隔离。这是最基本的需求,两个不同的应用程序可能会依赖同一个第三方类库的不同...
  • u011393781
  • u011393781
  • 2016-10-21 16:23:25
  • 680

Tomcat内核之Tomcat的类加载器

跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制。一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2014-12-14 20:25:13
  • 3950

Tomcat源码解析(六):类加载器

一、loader的作用是什么?loader是根据请求加载对应的类。jvm有自带的loader,而tomcat中没有直接用java自带loader,是为了安全和重载。安全:jvm自带loader载入的s...
  • zhangguixian5
  • zhangguixian5
  • 2016-08-14 17:03:16
  • 441

真正理解线程上下文类加载器(多案例分析)

线程上下文类加载器破坏了“双亲委派模型”,可以在执行线程中抛弃双亲委派加载链模式,使上层代码可以逆向使用下层的系统类加载器。本文通过JDBC和Tomcat两个案例分析,详细解释了其中的原理。...
  • yangcheng33
  • yangcheng33
  • 2016-09-25 13:31:36
  • 7598
收藏助手
不良信息举报
您举报文章:java的类加载器和Tomcat的类加载器
举报原因:
原因补充:

(最多只允许输入30个字)