什么是类加载器

作用:

负责把.class文件(存储的物理文件)加载在到内存中

类加载时机:
  1. 创建类的实例(对象)
  2. 调用类的类方法
  3. 访问类或者接口的类变量,或者为该类变量赋值
  4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  5. 初始化某个类的子类
  6. 直接使用java.exe命令来运行某个主类

总结:用到就加载,不用就不加载

类加载过程:

当一个类被使用的时候,才会加载到内存

  1. 加载
  2. 验证(链接)
  3. 准备(链接)
  4. 解析(链接)
  5. 初始化
类加载过程——加载:
  1. 通过包名 + 类名,获取这个类,准备用流进行传输
  2. 将这个类加载到内存中
  3. 加载完毕创建一个class对象

在这里插入图片描述

类加载过程:链接

验证:

作用:文件中的信息是否符合虚拟机规范有没有安全隐患

在这里插入图片描述
准备:

作用:负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

在这里插入图片描述
解析:

作用:本类中如果用到了其他类,此时就需要找到对应的类
像String name 这个变量,String在准备的时候是使用一些符号代替的,到了解析这一步才会找到对应的String类解析并引用

在这里插入图片描述

类加载过程:初始化

作用:对静态变量赋值以及初始化其他资源

在这里插入图片描述

类加载器分类:
  1. Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
  2. Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
  3. System class loader:系统类加载器,负责加载用户类路径上所指定的类库
  4. UserClassloader:自定义类加载器

类加载器的继承关系:

  1. 自定义类的父加载器为System
  2. System的父加载器为Platform
  3. Platform的父加载器为Bootstrap
public class Demo01 {public static void main(String[] args) {//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println("系统类加载器" + systemClassLoader);//获取系统类加载器的父加载器 ‐‐‐ 平台类加载器ClassLoader platform = systemClassLoader.getParent();System.out.println("平台类加载器" + platform);//获取平台类加载器的父加载器 ‐‐‐ 启动类加载器ClassLoader bootstrap = platform.getParent();System.out.println("启动类加载器" + bootstrap);}
}
双亲委派模型:

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,再一层一层返回给子类,然后子类加载器才会尝试自己去加载,这就是双亲委派模式

在这里插入图片描述

ClassLoader 中的两个方法:
方法名说明
public static ClassLoader getSystemClassLoader()获取系统类加载器
public InputStream getResourceAsStream(String name)加载某一个资源文件
public class Demo02 {public static void main(String[] args) throws IOException {//static ClassLoader getSystemClassLoader() 获取系统类加载器// InputStream getResourceAsStream(String name) 加载某一个资源文件// 获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件// 参数:文件的路径(放在src的根目录下,默认去那里加载)// 返回值:字节流。InputStream resourceAsStream = systemClassLoader.getResourceAsStream("prop.properties");Properties properties = new Properties();properties.load(resourceAsStream);System.out.println(properties);resourceAsStream.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

原文出处: 小宝鸽 一、使用场景举例 在了解Transactional怎么用之前我们必须要先知道Transactional有什么用。下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设…

日志-Log4J

日志: 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储 日志和输出语句的区别: 输出语句日志技术取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好输出位置只能是控制台可以将日志信息写入…

VMware安装虚拟机Mac版

VMware: 1、不需要分区或重开机就能再同一台PC上使用多种操作系统。 2、完全隔离并且保护不同操作系统的环境以及所有软件、资料。 3、不同的操作系统之间还能互动操作 4、有复原功能 5、能够设置并且随时修改操作系统的操作环境 下载地址:https://www.v…

黑暗之魂3正在从服务器获取信息,黑暗之魂3如何解决入侵服务器问题 | 手游网游页游攻略大全...

发布时间:2016-01-04今天为大家带来的是黑暗之魂3法兰守卫入侵方法,一起来看看吧! 黑暗之魂3 法兰守卫入侵方法 法兰守卫怎么入侵 今天为大家带来的是黑暗之魂3法兰守卫入侵方法,一起来看看吧! 你的游戏可能被防火墙禁止了——解决方法:找到你的 ...标签&#xff1a…

webpack之font-awesome

1、安装font-awesome和font-awesome-loader及依赖 git:https://github.com/shakacode/font-awesome-loader npm install font-awesome-loader less less-loader css-loader style-loader file-loader font-awesome -save 2、配置webpack 官方给出的webpack2.0配置如…

目录命令及权限

目录命令及权限: 命令说明ls列出目录cd切换目录pwd显示目前的目录mkdir创建新目录rmdir删除一个空的目录cp复制文件或目录rm移除文件或目录mv移动文件与目录或修改文件与目录的名称 ls列出目录: ls # 显示不隐藏的文件和文件夹 ls -l # 显示不隐藏的…

前端通信:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码(改迭代已作废,移步迭代10)...

该迭代已作废,最新的请移步这里:https://www.cnblogs.com/GerryOfZhong/p/10726306.html 距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这个行业,让大脑休息一下。一个人旅行,一个人休息&am…

设计模式之 - 代理模式(Proxy Pattern)

代理模式:代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。很多可以框架中都有用到,比…

JavaEE规范与系统结构

JavaEE规范: JavaEE规范是J2EE规范的新名称,早期被称为J2EE规范,其全称是Java 2 Platform Enterprise Edition,它是由SUN公司领导、各厂家共同制定并得到广泛认可的工业标准(JCP组织成员)。之所以改名为Jav…

HTTP协议和NDS服务器

HTTP协议: HTTP的全称是:Hyper Text Transfer Protocol,意为超文本传输协议。它指的是服务器和客户端之间交互必须遵循的一问一答的规则。形容这个规则:问答机制、握手机制。它规范了请求和响应内容的类型和格式。HTTP协议是由W3C…

Servlet方法详解

Servlet: Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一。使用JavaEE的API。目前在Oracle官网中的最新版本是JavaEE8, Servlet是一个运行在web服务端的java小程序它可以用于接收和响应客户端的请求要…

继承的实现原理

一.继承的实现原理 1.继承顺序 1.1单独分叉线路&#xff1a;经典类与新式类依次从左到右&#xff0c;深度优先 1.2多条重合线路&#xff1a;经典类一路到头&#xff0c;深度优先&#xff1b;新式类&#xff0c;广度优先。<参考MRO列表&#xff0c;仅在新式类有> class A(…

Response响应方法详解

Response&#xff1a; 响应&#xff1a;服务器把请求的处理结果告知客户端。在B/S架构中&#xff0c;响应就是把结果带回浏览器。响应对象&#xff1a;在项目中用于发送响应的对象 常用状态码&#xff1a; 状态码说明200执行成功302它和307一样&#xff0c;都是用于重定向的状…

perl6 HTTP::UserAgent (2)

http://www.cnblogs.com/perl6/p/6911166.html 之前这里有个小小例子&#xff0c; 这里只要是总结一下。 HTTP::UserAgent包含了以下模块: ---------------------------------------------------------------------------------------------- Module |Path-Nam…

Java会话技术

会话技术&#xff1a; 会话指的是客户端浏览器和服务端之间的度偶次请求和响应当打开浏览器&#xff0c;访问网站地址后&#xff0c;会话开始&#xff0c;当关闭浏览器&#xff08;或者到了过期时间&#xff09;&#xff0c;会话结束。就像打电话只要不挂电话就是一次会话。 会…

【调用IP宏文件进行仿真】modelsim仿真时出现 Instantiation of 'xxx' failed. The design unit was not found....

出现错误类似&#xff1a;modelsim 仿真fifo时出现 Error: (vsim-3033) E:/Programs/ModelSim/fifo/ps2_fifo.v(75): Instantiation of scfifo failed. The design unit was not found.仿真波形不对&#xff0c;调用的ip核没有输出&#xff08;白色虚线&#xff09;等情况&…

Java Server Page

JSP JSP全称是Java Server Page&#xff0c;基于Java和Servlet一样是sun公司推出的一套开发动态web资源的技术&#xff0c;称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。jsp是一种动态网页技术标准&#xff0c;jsp部署在服务器上可以处理客户端的请求&#xff0c;并根据…

HDFS概述(2)————Block块大小设置

参考&#xff1a;HDFS概述&#xff08;4&#xff09;————HDFS权限HDFS概述&#xff08;3&#xff09;————HDFS FederationHDFS概述&#xff08;2&#xff09;————Block块大小设置HDFS概述&#xff08;1&#xff09;————HDFS架构问题Q: 一个常被问到的一个问题是…

BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】

1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2925 Solved: 1927[Submit][Status][Discuss]Description 城市C是一个非常繁忙的大都市&#xff0c;城市中的道路十分的拥挤&#xff0c;于是市长决定对其中的道路进行改造。城市C的道 路是这样分…

Mysql介绍与安装LinuxmacOS系统

数据库&#xff1a; 用于存储和管理数据的仓库 数据库的好处&#xff1a; 可以持久化存储数据方便存储和管理数据使用了统一的方式操作数据库 – SQL 常见的数据库&#xff1a; Oracle&#xff1a;收费的大型数据库&#xff0c;Oracle公司的产品。Oracle收购SUN公司&#xff0c…