Javaweb-类加载器-类加载器的了解入门

前面的动态代理学完了,以后在学习Spring的时候会用到这些动态代理的知识和原理,像目标对象,增强这两个术语,会经常听到。学习动态代理,就是学习JDK中反射包下的一个Proxy类,具体来说,我们只是学习newProxyInstance(ClassLoader, interfaces, hander)这个方法。这篇开始来学习下,加载器,我们在学习获取动态代理,第一个要准备的参数就是,类加载器,通过这篇的学习,稍微对类加载器有入门的了解。

来源:凯哥Java(kaigejava)

什么是类加载器(作用)

就是把计算机本地磁盘上的.class文件加载进JVM内存中方法区,变成Class对象,实现这个过程的对象就是类加载器,这个类加载器本身也是一个类。

如何得到类加载器

前面我们学习动态代理的时候,是通过当前类来获取类加载器,就是下面这行代码。

ClassLoader loader = this.getClass().getClassLoader();

这个getClassLoader()方法是在Class类中定义的方法。

类加载器的分类

类加载器有三个分类,以下三类分工明确,负责不同的类加载。

引导类加载器

这个分类主要是类库加载,例如jre下面的lib文件夹中的rt.jar中类加载进JVM内存。

扩展类加载器

这部分就是把扩展的类库加载到内存,例如jre下面的ext文件夹下的全部文件,ext就是英文扩展单词的前缀缩写。

系统类加载器

这分类就是加载一些应用下的类,例如我们写一个web项目,我们使用到很多其他第三方的jar包,这些类就是系统类加载器来完成加载。还有我们自己写的代码文件,也是系统类加载器完成这操作。

这三个分类的关系是,系统类加载器的上层是扩展类加载器,扩展类加载器的上层是引导类加载器,引导类加载器是老大,没有上层。

类加载器的委托机制

由于上面三个类加载器分类的关系,产生了一个概念,叫类加载器的委托机制。先来看看下面这个过程,然后解释什么是委托机制。

一开始,我们在代码中写这行代码new A(); 由于A类可能是JDK自带,也可能是程序员自己写的,这个类在加载进内存需要经历下面这个过程。

1) 系统类加载器发现自己要加载A类,因为这是在应用下的代码,理应系统类加载器去处理加载。

2) 系统类加载器,根本不看这个A类是不是在自己管辖范围,直接通知扩展类加载器,想让扩展加载器去加载A类。

3) 扩展加载类也不管,直接通知引导加载类,想让引导加载类去执行加载。

4) 引导加载类发现这个A类是rt.jar中的类,然后就加载到JVM内存的方法区,把这个Class对象返回给了扩展,然后扩展把这个对象Class对象返回给系统加载类,加载过程结束。

5) 如果引导加载器发现A类不是自己管辖范围,返回null给扩展。

6) 扩展类加载器发现上层返回null, 只好扩展去自己管辖范围查找,查找到了,就加载进入内存,返回对应class对象给系统加载器,加载过程结束。

7) 如果扩展器没有找到A类,就返回null给系统类加载器。

8) 系统类加载器发现上层返回null,只好去自己管辖范围查找A类,找到了就加载进JVM内存,返回class对象,加载过程结束。

9) 如果系统类也找不到这个A类,抛出异常,ClassNotFoundException

这个过程就是委托机制,所有加载任务都优先交给自己的上层去完成,上层完成不了然后才自己处理,这样就包装了类加载的安全,不会同时存在,三个类型加载器同时加载一个类的情况。

在实际的类解析过程中,类的加载还是要看线程,每一个线程就有自己的类加载器。所以本篇的类加载器的基础,有助于我们以后学习多线程并发和JVM这块的知识点。

Tomcat中的类加载器

简单来了解下Tomcat中的类加载器,在Tomcat中有两种类加载器。

1) 服务器类加载器,负责加载tomcat下${CATALINA_HOME}\lib下的类,也就是tomcat安装目录下lib文件夹中的类。

2) 应用类加载器,这个主要加载当前web项目下\WEB-INF\lib 和\WEB-INF\classes, 就是我们程序员代码编译之后文件在\WEB-INF\classes,一些第三方jar包在\WEB-INF\lib。

说一下这种类加载器和前面知道的三个类加载器的区别和关系。在Tomcat下两种类加载器都排下上面系统类加载器的下面,这两个的上层都是系统类加载器。在Tomcat中的两种类加载器有一个共同特性:先自己动手,然后去委托。通过前面的委托机制的学习,应该知道这句话的含义。Tomcat中两种类加载器会自己一开始就去自己管辖范围查找和加载类,如果没有找到才去委托给系统类加载器。

联系凯哥:凯哥Java(kaigejava)或个人博客:www.kaigejava.com(个人博客可以发即时消息给凯哥哦~)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Super 前端

Tomcat性能调优

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

52210
来自专栏全栈开发之路

学JSP过程中遇到的报错

<%@ page import="javax.servlet.http.,javax.servlet." %>

11250
来自专栏大数据手稿笔记

入门教程 | 从安装部署开始学习 Elasticsearch

Elasticsearch 是目前最流行的搜索引擎,学习 ES 的第一步便是安装部署。本文内容包含以下三部分:

12220
来自专栏国产程序员

Spring Boot - Undertow容器启动

19120
来自专栏吉林乌拉

Spring Boot入门篇

很长时间不写博客了,究其原因则是这几个月工作及生活都发生了很多事情,导致不得分心处理这些。最近难得忙里偷闲,决定还是继续更新吧。毕竟一件事情做久了,如果突然中断...

10350
来自专栏Super 前端

tomcat的jvm和session同步配置

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

9510
来自专栏Java技术栈

Tomcat 的 Server 文件配置详解!

Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛。server.xml是Tomcat中最重要的配置文件,server.xml的...

11920
来自专栏算法之名

Springboot2吞吐量优化的一些解决方案

Docker隔离就不说了,很简单,先来看一下异步执行吧,很多人做异步执行的时候都写的千奇百怪的,其实JDK 8本身有一个非常好用的Future类——Comple...

35140
来自专栏一猿小讲

一篇文章讲透线上应用监控

“线上服务停了,要重启一下”?久经职场做研发的程序员,视线会逐渐转移到线上应用的运行状态。设想一下,如果你在半夜两点正在酣眠美梦时,微信群里突然炸开锅:“服务停...

13630
来自专栏java技术大本营

tomcat学习|tomat中的server.xml的学习

小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营

6540

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励