类加载器与反射

1:Java类加载机制

简介:

虚拟机把数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

2:JVM加载Class文件的原理机制

Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。

在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

3:类装载方式

1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中

2.显式装载, 通过class.forname()等方法,它只是先加载一些基础类到jvm中,至于其他类,则在需要的时候才加载。这样可以节省内存开销

4:类装载的执行过程

类装载分为以下 5 个步骤:

加载:根据查找路径找到相应的 class 文件然后导入;

验证:检查加载的 class 文件的正确性;

准备:给类中的静态变量分配内存空间;

解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;

初始化:对静态变量和静态代码块执行初始化工作。

5:类加载器

主要有一下四种类加载器:

启动类加载器(Bootstrap ClassLoader):用来加载java核心类库,无法被java程序直接引用。

扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的 实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。(JDK9之后,扩展类加载器被重命名为平台类加载器)。

系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。

6:反射机制

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;他能这种动态获取的信息以及动态调用对象的方法

1:优点

 运行期类型的判断,动态加载类,提高代码灵活度。

2:缺点

性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,过程比直接的java代码要多了一步委托的过程,反射需要类加载器通过双亲委派模型实现动态编译,效率较低。

7:静态编译与动态编译

静态编译:在编译时确定类型

动态编译:运行时确定类型,绑定对象

8:双亲委派机制

JVM中有三大类加载器:启动类加载器(最顶层),平台类加载器(中层),系统类加载器(下层)。

双亲委派模型就是指一个类加载器收到了类加载请求,它不会直接自己先加载,而把请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,就再往上委托,赴到最顶层的类加载器,如果父类加载器可以完成类加载任务,就成功返回,若不能,就向下传递,让子加载器去加载,这就是双亲委派模式。双亲委派模型主要是用来保证同一个类只能被一个类加载器加载。

9:如何破坏双亲委派机制

一般在自定义类加载器中,我们不希望通过双亲委派机制一层层向上再下来,而是希望直接通过自己定义的类加载器直接实现类加载,来提升加载性能,比如Tomcat中的web容器类加载器就是破坏了双亲委托模式的,里面的WebApplicationClassLoader除了核心类库外,都是优先加载自己路径下的Class。

要打破双亲委派机制,只要在重写loadclass的过程中,不遵从JVM规范就行了,也就是不盲目优先向Parednt的ClassLoader查找即可。

10:反射的使用场景

JDK动态代理,Spring中的注入属性,调用方法等。

反射更多是为了灵活舍弃一部分性能,自己使用一般用在工具类中,比如频繁通过参数名来调用指定的方法时,可以用通过反射去匹配指定的方法名,然后实现功能。

11:Java中获取反射的三种方法

1、类名.class属性;

2、对象名.getClass()方法;

3、Class.forName(全类名)方法

12:反射可以获取“私有”方法或构造函数或私有成员变量

有专门反射私有构造函数的方法 clazz.getDeclaredConstructor(int.class);来读取私有的构造函数,私有成员变量和私有方法也一样,但用这个方法读取完还需要设置一下暴力反射才行:c.setAccessible(true)。

13:静态方法和实例方法的区别

1、静态方法属于整个类所有,因此调用它不需要实例化,可以直接调用(类.静态方法())。实例方法必须先实例化,创建一个对象,才能进行调用(对象.实例方法())。

2、静态方法只能访问静态成员,不能访问实例成员;而实例方法可以访问静态成员和实例成员。 3、在程序运行期间,静态方法是一直存放在内存中,因此调用速度快,但是却占用内存。实例方法是使用完成后由回收机制自动进行回收,下次再使用必须再实例化。

4、一般来说,公共的函数、经常调用的可以写成静态方法,比如数据连接等(SqlHelper)。

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

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

相关文章

“茶叶创新:爆改营销策略,三个月狂销2300万“

我的朋友去年制作了一款白茶,并在短短三个月内将其销售量推到了2300万的高峰。你相信吗? 这位朋友并没有任何茶叶方面的经验,他只是一个有着冒险精神的企业家。他先找到了一家代工厂,帮助他把他的茶叶理念转化为现实。 当他把茶叶…

win11,安装python,pip,和opencv

1,安装python 在应用商店,输入python,下载安装 2,安装pip 在cmd中,输入pip install SomePackage,安装某一个版本的pip 3,安装opencv 在cmd中,输入 pip3 install opencv-contrib-python -i https://pyp…

【Python】153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。

问题描述 153是一个非常特殊的数,它等于它的每位数字的立方和,即1531*1*15*5*53*3*3。编程求所有满足这种条件的三位十进制数。 输出格式 按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。 方法一: for i in range(10…

私域运营如何提高收益?

一旦建立了私域之后,企业需要不断地进行数据统计与分析,以寻找提高收益的方法。通过收集和分析用户的信息,了解他们的购物行为、心理需求等,从而制定更符合顾客口味的促销计划和产品服务。只有持续对数据进行监控,才能…

代码随想录 10.13 || 二叉树 LeetCode 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

二叉树的定义: 回顾一下二叉树的定义,加固记忆。 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptre) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, Tre…

crontab配置定时根据名称杀进程

服务器上某个进程杀掉后会重启,怀疑是被当成肉鸡,因此是用linux自带的crontab定时执行脚本杀掉进程 上传脚本文件到服务器 #! /bin/bash # 要杀掉进程的名称 APPLICATION"ntools"if pkill -f "${APPLICATION}"; thenecho "${…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】Optimized Hot Spot Analysis 优化的热点分析https://mp.weixin.qq.com/s/lfoIls8exW5G6PPJ9gtDew em,先给大家推荐一个空间统计分析的学习资源网站 https://spatialstats-analysis-1.hub.arcgis.com/ .…

策略选股辅助工具(八)

8-策略选股辅助工具 文章目录 8-策略选股辅助工具一. 查询某个股票日常分析数据的信息二. 查询可以做T的股票的策略信息三. 查询股票K线类型四. 查询策略因子筛选股票信息五. 查询日K数据 处理成 Pdf图信息六. 根据股票的编码和日期获取那段时间的所有的数据信息 一. 查询某个股…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 🥊 Python 什么是 Python? Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

渲染器——双端Diff算法

简单 Diff 算法利用虚拟节点的 key 属性,尽可能地复用 DOM 元素,并通过移动 DOM 的方式来完成更新,从而减少不断地创建和销毁DOM 元素带来的性能开销。但是,简单 Diff 算法仍然存在很多缺陷,这些缺陷可以通过双端 Diff…

【阿里云】图像识别 摄像模块 语音模块

USB 摄像头模块测试及配置 一、首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中二、然后通过 lsmod 命令可以看到内核自动加载了下面的模块三、通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为 /dev/video0四、使用 fswebcam 测试 USB 摄像头五、使用 motion …

chrome内置路径合集

设置黑夜模式: 输入网址:chrome://flags/ 搜索dark 改为enable 实验项目路径 chrome://flags/ 可用来启用或者关闭某些 Chrome 的实验功能 chrome://settings 将快速打开 Chrome 浏览器的设置页面,页面的内容分类划分为基础和高级设置选项 …

以太网_底层

【实物图】 【网线接口】 MAC(媒体访问控制器):控制数据的收发和管理,和用户层打交到;通过MII/RMII、SMI接口和PHY进行通信。 PHY(以太网物理层收发器):中间体,负责收发信号的转换 常见PHY芯片有:LAN8720…

ES学习看这一篇文章就够了

ES学习看这一篇文章就够了 ES学习看这一篇文章就够了-CSDN博客

PIL如何批量给图片添加文字水印?

PIL如何批量给图片添加文字水印? 1 简单引入2 关于PIL3 本文涉及的PIL的几个类4 实现原理5 实现过程5.1 原始图片5.2 导入相关模块5.3 初始化数据5.4 水印字体设置5.5 打开原始图片并新建存储对象5.6 计算图片和水印的大小5.7 选择性设置水印文字5.8 绘制文字并设置…

基于yolov8的车牌检测训练全流程

YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型,YOLOv8在之前版本的成功基础上引入了新功能和改进,以提高性能、灵活性和效率。YOLOv8支持全范围的视觉AI任务,包括检测, 分割, 姿态估计, 跟踪, 和分类。这种多功能…

Java项目实战《苍穹外卖》 三、登录功能

测测你是什么人格吧,地址: MBTI 16种人格测试官网 系列文章目录 苍穹外卖是黑马程序员2023年的Java实战项目,作为业余练手用,需要源码或者课程的可以找我,无偿分享 Java项目实战《苍穹外卖》 一、项目概述Java项目实战…

Redis从入门到精通(三)-高阶篇

文章目录 0. 前言[【高阶篇】3.1 Redis协议(RESP )详解](https://blog.csdn.net/wangshuai6707/article/details/132742584)[【高阶篇】3.3 Redis之底层数据结构简单动态字符串(SDS)详解](https://blog.csdn.net/wangshuai6707/article/details/131101404)[【高阶篇】3.4 Redis…

java算法学习索引之栈和队列(未完)

一 设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。 public class …