类加载

java程序运行时类加载的方式和流程是:

编译 》加载 》验证 》准备 》解析 》初始化

编译:将java代码编译为字节码文件

加载:查找并通过io读入字节码文件,在内存中生出一个代表类的class对象,作为访问方法区的

输入入口,使用到类的时候才会加载

验证:字节码的校验,是否正确

准备:给类的静态变量分配内存,并赋予默认值

解析:将符号引用替换为直接引用,静态链接过程

初始化:对类的静态遍历,初始化指定值,执行静态代码块

类加载器

以上的流程中类加载过程主要通过类加载器实现,java中主要有四个类加载器

引导类加载器

负责加载jre lib目录下的核心类库,如charset.jar,rt.jar等

扩展类加载器

负责加载lib目录下 ext扩展目录的jar类包

应用程序类加载器

负责加载classPath 路径下的类包,就是我们写的代码

自定义加载器

负责加载用户自定义路径的类

双亲委派机制

上述加载器的加载顺序是:首先加载自定义加载器,然后是应用程序类加载器,然后再是扩展类加载器,最后才是引导类加载器

加载的方式:

自定义加载器加载        加载到类   则返回

没有找到,向上委托(父加载器,没有继承关系)

appClassLoad(应用程序加载器)          加载到类  返回

没有找到,委托上级

extClassLoad(扩展类加载器)        加载到类  返回

没有找到,委托上级

classLoad(引导类)        加载到类  向下委托

没有找到,再向下委托 。。。。

流程:

自定义 》》 app 》》 ext  》》 system  》》 ext  》》 app  》》自定义

这个就是所谓的双亲委派机制。那么这儿可能就有疑问了:

为啥不从system(引导类) 开始往下找,还要来回循环一遍?

基本上大部分的类加载的都是我们自己写的内容(自带的内容需要加载的很少),双亲委派机制只有第一次会从app开始加载,第二次的时候不用再向上委托了,如果从system开始往下找,那么循环会更多次。

还有两个特别重要的原因(主要原因)

1. 沙箱安全机制,避免核心api库被篡改

比如我也定义个String,如果从上往下,那么String不是被覆盖了?

2. 避免类的重复加载

自定义类加载器实现

只需要继承ClassLoader, 该类有两个核心方法,一个是loadClass(String, boolean),

实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义

类加载器主要是重写findClass方法

打破双亲委派机制

如何打破双亲委派机制?

其实很简单,就不往上委托,自己去加载

重写我们的 loadClass方法就可以了,但是要注意核心的比如Object这种类不能自定义

加载(会有沙箱安全问题)

java默认是双亲委派机制,为什么要打破?

最常见的打破双亲委派机制就是我们的Tomcat

原因:

1.tomcat 是一个容器,同时会部署多个应用,如果我们多个应用程序用的东西都

是不同版本的,一个jdk6 一个jdk8 那么不是就出问题了?所以要保证相互隔离

2.相同的类库相同的版本最好能共享,不然有10个就需要10个相同类库加载

3.基于安全考虑,应用程序的类库和web容器类库要隔离开来

java 类的加载机制详解相关推荐

  1. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

  2. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)

    [1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...

  3. 中yeti不能加载_第二十章_类的加载过程详解

    类的加载过程详解 概述 在 Java 中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内 ...

  4. php自动加载类与路由,PHP实现路由与类自动加载步骤详解

    这次给大家带来PHP实现路由与类自动加载步骤详解,PHP实现路由与类自动加载步骤详解的注意事项有哪些,下面就是实战案例,一起来看一下. 项目目录如下 入口文件index.php<?php def ...

  5. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  6. 深入理解Java虚拟机:Java类的加载机制

    本篇内容包括:Java 类的加载机制(Jvm 结构组成.Java 类的加载).类的生命周期(加载-验证-准备-解析-初始化-使用-卸载).类加载器 以及 双亲委派模型. 一.Java 类的加载机制 1 ...

  7. 初识jvm-1.Java类的加载机制

    转载: jvm系列---纯洁的微笑 地址: http://www.ityouknow.com/jvm.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其 ...

  8. jvm系列(一):java类的加载机制

    1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结 ...

  9. java类的加载机制

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  10. 类的加载过程详解:加载、验证、准备、解析、初始化

    想要弄明白的知识点: 类加载的过程,加载.验证.准备.解析.初始化.每个部分详细描述. 加载阶段读入.class文件,class文件时二进制吗,为什么需要使用二进制的方式? 验证过程是防止什么问题?验 ...

最新文章

  1. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors
  2. 、PHP只能访问mysql_php中 mysql函数不能调用,只有mysql_query()可以用
  3. Linux crontab 命令格式与详细例子
  4. vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止
  5. 基础知识(四)Dijkstra算法
  6. linux更换域名全站301,linux服务器wdcp面板做301域名重定向设置
  7. 首个月球旅客!SpaceX将送普通人上太空,马斯克暗示首单来自日本
  8. c++之static的一些用法
  9. 软件开发常用设计模式—单例模式总结(c++版)
  10. L298电机驱动原理图+PCB
  11. pth(pass the hash)哈希传递攻击
  12. Redis 哨兵安装-Centos
  13. 软件实训:手把手写一个简单的javaweb项目
  14. 怎样做一个拥有全局观的人
  15. dma_alloc_coheren
  16. Delphi图像处理 -- 灰色浮雕
  17. C.Defuse the Bombs(简单二分)
  18. 无线通信学习笔记(一)
  19. MySQL命令行导出数据库(sql脚本)
  20. OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

热门文章

  1. php201534,PHP设计聊天室步步通4
  2. 北京内推 | 微软亚洲研究院视觉计算组招聘研究与开发实习生
  3. 如何破解无线网密码进行上网
  4. vbs定时自动发送qq消息
  5. 测绘工作日常总结(不定稿)
  6. struts2拦截器原理
  7. 超级外链工具:一款超级外链SEO工具源码
  8. 教你恢复电脑被删的照片或视频,方法实用可收藏
  9. 梅花6的11万极点+四字上词拼音首字母全GBK五笔简繁词库(新增五笔98词库)
  10. php对联广告,js 左右悬浮对联广告代码示例