当前位置: 首页 > news >正文

JVM学习-类加载

目录

1.类文件结构

 2.类加载器 

3.类加载的三个阶段

        3.1加载

        3.2链接 

                3.2.1验证

                3.2.2准备阶段

                3.2.3解析阶段

        3.3初始化

4.拓展:反射

        4.1获取类对象

        4.2创建实例

        4.3获取方法

        4.4方法调用


1.类文件结构

 2.类加载器 

        类加载器用来将类文件的二进制字节码加载到JVM的方法区中。有四种类加载器:

        连接数据库驱动调用的类加载器:在连接数据库时会调用DriverManager类进行驱动,而DriverManager是核心类,所以会使用到启动类加载器;但数据库连接的驱动包并不在核心类库中,所以DriverManager类中有一个loadInitialDrivers()方法,内部使用了两种方式加载驱动:
          第一种是SPI机制加载驱动,约定是在jar包中添加一个META-INF/services目录,在其中添加一个配置文件,文件的名称就是接口的全限定名称,数据库连接驱动就是java.sql.Driver,文件内容就是接口的实现类 ;通过ServiceLoader.load()方法根据约定的路径找到实现类;这个load方法的内部调用的是线程上下文类加载器,由于在创建线程时默认分配的是应用类加载器,所以这种机制实际上调用的是应用类加载器。第二种是使用系统变量jdbc.drivers定义的驱动类的类名加载驱动,调用Class.forName()方法加载和初始化驱动类,使用的是系统类加载器,也就是应用类加载器。

        数据库连接驱动是先调用的系统类加载器再调用的应用类加载器,所以在某些情况下会打破双亲委派机制。

3.类加载的三个阶段

        类加载分为三个阶段:加载、链接、初始化。链接又分为三个阶段:验证、准备、解析。

        3.1加载

        

        要注意的是,一个类的.class文件加载到方法区后变成了C++的instanceKlass文件,这个文件中包含了这个类的各种信息,然后再在堆中生成一个Class类型的对象(区分class,class是定义一个类用的;区分.class文件,这是编译生成的一个类的二进制字节码,还没有被加载),因为java不能直接访问方法区的instanceKlass,所以需要这个Class副本来供我们使用,通过反射拿到的一个类的Class对象就是这么来的,这也就是为什么这个Class对象被叫做类镜像了。

        3.2链接 

                3.2.1验证

        验证这个类转换的字节码是否符合JVM规范,并进行安全性检查,比如检查字节码中的魔数是否是Java文件的魔数。

                3.2.2准备阶段

        给静态变量分配空间,并设置默认值:

  • 静态变量在JDK7之前是放在instanceKlass的末尾也就是方法区中,而在JDK7之后则是放在了类镜像末尾,也就是堆内存中。
  • 静态变量的空间分配在准备阶段完成,而赋值则是在初始化阶段,但是final类型的静态变量比较特殊:如果是final的基本类型或字符串类型的静态变量,则分配空间和赋值都在准备阶段完成,因为对于这些类型的变量而言final说明值不会改变,已经确定了静态变量的值,所以在准备阶段会直接赋值;而如果是final的引用类型的静态变量则赋值会放在初始化阶段,因为new一个对象需要类先初始化完成后才能创建。
                 3.2.3解析阶段

        将常量池的符号引用解析为直接引用。符号引用就是这个类虽然被加载了,但由于还没有进行解析,也就不知道这个类在内存中的位置,相当于只是一个符号;而直接引用就是经过了解析之后,知道了其在内存中的具体位置,就可以访问这个类了。

        3.3初始化

        类的初始化是为了确保类的结构正确并且所有的数据都已初始化为预期的状态,只有在类的初始化完成后才能在系统中正常使用这个类及其方法和属性。初始化过程主要包括给静态变量赋值、静态代码块的执行等,只有首次主动使用时才会触发初始化,初始化是懒惰的,且只进行一次。
        初始化发生的时机:

  • main方法所在的类会先进行初始化。
  • 首次访问这个类的静态变量或静态方法时。
  • 子类进行初始化时,若父类还没有初始化,则会先进行父类的初始化再进行子类的初始化。
  • 当子类访问父类的静态变量时,只会触发父类的初始化。
  • 当执行Class.forName方法时,会执行类加载并默认进行初始化;当然也可以给参数initialize设置为false表示不执行初始化。
  • 通过new创建实例化对象时会触发初始化。

        以下情况不会触发初始化:

  • 访问静态常量时,因为静态常量的空间分配和赋值均在链接时的准备阶段完成。
  • 使用类加载器的loadClass方法时,loadClass方法只进行加载阶段。
  • 访问类对象的.class文件时不会触发初始化,因为Class对象在class文件加载到方法区后就会生成,所以在加载阶段时就已经生成。
  • 创建该类的数组不会触发初始化,因为在JVM中会生成一个其他的类来表示数组类型,与原本的类无关,所以不会触发原来的类的初始化。

4.拓展:反射

        反射:通过使用类对象(即堆中的Class对象)来创建实例、调用方法等。   

        4.1获取类对象

Class c=类名.forName();
或
Class<?> c=类名.class;
或
Class<?> c=类名.getClass();

        以下操作都建立在获取了Class对象的基础上

        4.2创建实例

Object o=c.newInstance();

        也可以通过指定的构造器来创建实例,比如使用String的构造器来创建实例:  

//先获取String类的带一个String类型参数的构造器
Constructor cst=c.getConstructor(String.class);  //再通过调用构造器的newInstance方法来创建实例  
Object o=cst.newInstance("abc");                         

        4.3获取方法

//获取这个类的除继承父类的方法外的其他所有方法
Method[] m1=c.getDeclaredMethods();//获取这个类的所有公有方法               
Method[] m2=c.getMethod();   //获取指定方法 
Method m=c.getMethod("方法名");                    

         4.4方法调用

//先获取指定的方法 
Method m=c.getMethod("方法名"); //调用方法:
//当所调用的方法既有参数也有返回值时
Object result=m.invoke(参数集);//当所调用的方法没有返回值且无参数时
m.invoke(null);

相关文章:

JVM学习-类加载

目录 1.类文件结构 2.类加载器 3.类加载的三个阶段 3.1加载 3.2链接 3.2.1验证 3.2.2准备阶段 3.2.3解析阶段 3.3初始化 4.拓展&#xff1a;反射 4.1获取类对象 4.2创建实例 4.3获取方法 4.4方法调用 1.类文件结构 2.类加载器 类加载器用来将类文件的二进制字节码加载到JV…...

PyCharm中如何使用不同的虚拟环境

1. 简介 有些项目用老的运行环境&#xff0c;而有些项目用新的运行环境&#xff0c;那么我们在运行这些代码&#xff08;比如跑对比实验的时候&#xff09;如何进行切换呢&#xff0c;这时候就可以使用虚拟环境啦 2. 虚拟环境的创建 首先启动Anaconda Prompt 并在其中执行如…...

Unity Live Capture 中实现面部捕捉同步模型动画

Unity Face Capture 是一个强大的工具&#xff0c;可以帮助你快速轻松地将真实人脸表情捕捉到数字模型中。在本文中&#xff0c;我们将介绍如何在 Unity Face Capture 中实现面部捕捉同步模型动画。 安装 |实时捕获 |4.0.0 (unity3d.com) 安装软件插件 安装 Live Capture 软件…...

Codeforces Round 932(div2)||ABD

A-Entertainment in MAC 题意 可以对一个字符串进行两种操作&#xff1a; 将字符串反转将该字符串反转后接在原串的后面。 可以进行任意次上述操作&#xff0c;获得字典序最小的字符串。 数据范围 t ( 1 ≤ t ≤ 500 ) t(1≤t≤500) t(1≤t≤500) n ( 2 ≤ n ≤ 1 0 9 ) n…...

基于最小二乘法的太阳黑子活动模型参数辨识和预测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于最小二乘法的太阳黑子活动模型参数辨识和预测matlab仿真。太阳黑子是人们最早发现也是人们最熟悉的一种太阳表面活动。因为太阳内部磁场发生变化&#xff0c;…...

VSCode配置cuda C++编程代码提示的详细步骤

目录 VSCode配置cuda C++编程代码提示的详细步骤: 1、cuda编译环境的安装:...

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…...

使用Lua编写Wireshark解析ProtoBuf插件

文章目录 Wireshark Protobuf Lua-dissectorStep 1: 获取 WiresharkStep 2: 配置ProtoBuf相关设置添加ProtoBuf查找路径 Step 3 运行和调试Lua代码1. 添加Lua脚本2. 运行和调试 Step 4: 写Lua Dissector代码 :)Step 5(Optional): Decode AsGithub工程地址 Wireshark Protobuf L…...

ClickHouse副本节点数据损坏恢复

参考链接&#xff1a;https://blog.csdn.net/qq_42082701/article/details/127771766 参考链接&#xff1a;https://kb.altinity.com/altinity-kb-setup-and-maintenance/suspiciously-many-broken-parts/ # 背景CK配置为1分片2副本# 配置参数,这里我们将max_suspicious_brok…...

YOLOv9改进策略:注意力机制 | SimAM(无参Attention),效果秒杀CBAM、SE

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;SimAM是一种轻量级的自注意力机制&#xff0c;其网络结构与Transformer类似&#xff0c;但是在计算注意力权重时使用的是线性层而不是点积 yolov9-c-CoordAtt summary: 972 layers, 51024476 parameters, 510…...

宝塔 安装对外服务Tomcat和JDK

一、安装Tomcat\JDK 切记1&#xff1a;如果选择下载节点失败&#xff0c;请到软件商城安装 。 切记2&#xff1a;提醒安装Nginx或Apache &#xff0c;先点安装&#xff0c;进入再打叉关闭。因为Tomcat服务足够为我们搭建JavaWeb网站服务了。 切记3&#xff1a;Nginx占用80端口…...

rust最新版本安装-提高下载速度

1&#xff09;拉取依赖包将安装脚本输出到本地rust.sh脚本中 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs > rust.sh 2&#xff09;更新rust.sh脚本内容、修改源 # 编辑rust.sh vi rust.sh # 将RUSTUP_UPDATE_ROOT的值替换为&#xff1a; RUSTUP_UPDATE_ROOT&q…...

数据清洗与预处理:打造高质量数据分析基础

随着数据的快速增长,数据分析已经成为企业和组织的核心业务。然而,原始数据往往包含各种杂质和异常,这就需要我们进行数据清洗和预处理,以确保分析结果的准确性和可靠性。 1. 数据清洗的重要性: 数据清洗是指对原始数据进行检查、修正和完善,以消除错误、不一致性和噪声…...

Linux服务器(Debian系)包含UOS安全相关巡检shell脚本

#!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format output_file"server_security_inspection_report_${current_date}.txt"# Empty the file initially echo > $output_file# 获取巡检时间 (…...

BS4网络提取selenium.chrome.WebDriver类的方法及属性

BS4网络提取selenium.chrome.WebDriver类的方法及属性 chrome.webdriver: selenium.webdriver.chrome.webdriver — Selenium 4.18.1 documentation class selenium.webdriver.chrome.webdriver.WebDriver 是 Selenium 中用于操作 Chrome 浏览器的 WebDriver 类。WebDriver 类…...

Prompt Engineering(提示工程)

Prompt 工程简介 在近年来&#xff0c;大模型&#xff08;Large Model&#xff09;如GPT、BERT等在自然语言处理领域取得了巨大的成功。这些模型通过海量数据的训练&#xff0c;具备了强大的语言理解和生成能力。然而&#xff0c;要想充分发挥这些大模型的潜力&#xff0c;仅仅…...

移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展

科技的飞速发展&#xff0c;为我们的生活带来了诸多便利&#xff0c;从传统的家电产品到智能化的家居设备&#xff0c;我们的居家生活正朝着更智能、更便捷的方向变革。 3月14日&#xff0c;中国家电及消费电子博览会&#xff08;Appliance&electronics World Expo&#xf…...

Java中上传数据的安全性探讨与实践

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 文件上传的风险 二. 使用合适的框架和库 1. Spr…...

Leetcode 17. 电话号码的字母组合

心路历程&#xff1a; 之前看过这道题的解法但是忘了。一开始想多重循环遍历&#xff0c;发现不知道写几个for循环&#xff0c;于是想到递归&#xff1b;发现递归需要记录选择的路径而不是返回节点值&#xff0c;想到了回溯。 回溯的解题模板&#xff1a;维护两个变量&#xf…...

蓝桥杯单片机快速开发笔记——独立键盘

一、原理分析 二、思维导图 三、示例框架 #include "reg52.h" sbit S7 P3^0; sbit S6 P3^1; sbit S5 P3^2; sbit S4 P3^3; void ScanKeys(){if(S7 0){Delay(500);if(S7 0){while(S7 0);}}if(S6 0){Delay(500);if(S6 0){while(S6 0)…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...