类java的步骤_java类加载的过程

类加载就是三个过程:加载、链接、初始化

链接又可以分为验证、准备、解析

e8b467c381269da2345594715c6fe790.png

1.加载

将class字节码文件通过类加载器装入内存中

2.验证

确保当前class文件的字节流所包含的内容符合当前JVM的规范要求,并且不会出现危害JVM自身安全的代码,当前字节流不符合规范会抛出VerifyError的异常,或者子异常,验证的信息有:

(1)文件格式:验证二进制文件是什么类型,验证是否符合当前JVM规范,

(2)元数据验证:检查类是否有父类、接口,验证其父类、接口的合法性,验证被final修饰的类,  验证是否是抽象类,是否实现了父类的抽象方法或者接口中的方法,   验证方法的重载。

(3)字节码验证,主要验证程序的控制流程比如循环、分支等,

(4)符号验证,主要验证符号引用转换为直接引用时的合法性

3.准备

为静态变量分配内存和初始值

各种数据类型的初始值如下:

90731548335255f39da130fe3a84273a.png

如果是final修饰的静态变量,那么会直接进行计算 ,不会进行初始化

private static int aa = 10;//(1)

private static final int bb = 10;//(2)

在(1)的位置  static int aa = 10在准备阶段中不是10,而是初始值0,而

(2)static final int bb= 10会是10,因为final修饰的静态变量不会导致类的初始化,可以直接计算出结果。

4.解析

当通过准备阶段之后,进入解析阶段。解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。符号引用就是一组符号来描述目标,可以是任何字面量。

直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

5.初始化

是类加载过程的最后一步,会开始真正执行类中定义的Java代码。而之前的类加载过程中,除了在『加载』阶段用户应用程序可通过自定义类加载器参与之外,其余阶段均由虚拟机主导和控制

与『准备』阶段的区分:

准备阶段:变量赋初始零值

初始化阶段:根据Java程序的设定去初始化类变量和其他资源,或者说是执行类构造器clinit的过程

clinit:由编译器自动收集类中的所有类变量(静态变量)的赋值动作和静态语句块static{}中的语句合并产生

特点:

1.是线程安全的,在多线程环境中被正确地加锁、同步

2.对于类或接口来说是非必需的,如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成 clinit

3.接口与类不同的是,执行接口的 clinit不需要先执行父接口的 clinit,只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的clinit

Java程序对类的使用方式可分为两种:主动使用与被动使用。一般来说只有当对类的首次主动使用的时候才会导致类的初始化,所以主动使用又叫做类加载过程中“初始化”开始的时机。那啥是主动使用呢?类的主动使用包括以下几种【超级重点】:

1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令

2使用java.lang.reflect包的方法对类进行反射调用的时候

3.当初始化一个类的时候,若发现其父类还未进行初始化,需先触发其父类的初始化

4.在虚拟机启动时,需指定一个要执行的主类,虚拟机会先初始化它

5.当使用JDK1.7的动态语言支持时,若一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且这个方法句柄所对应的类未进行初始化,需先触发其初始化。

类的生命周期,加载过程完后多了使用、卸载

e0b49ad1a185ae8d73345a84274903fc.png

使用:

当 JVM 完成初始化阶段之后,JVM 便开始从入口方法开始执行用户的程序代码。这个使用阶段也只是了解一下就可以了。

卸载:

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存。这个卸载阶段也只是了解一下就可以了。

类加载器

b0c6c14138a66a037b6a6214bf879335.png

双亲委派机制

工作过程:若一个类加载器收到了类加载的请求,它先会把这个请求委派给父类加载器,并向上传递,最终请求都传送到顶层的启动类加载器中。只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载

优点:类会随着它的类加载器一起具备带有优先级的层次关系,可保证Java程序的稳定运作;实现简单,所有实现代码都集中在java.lang.ClassLoader的loadClass()中

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

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

相关文章

java拓展接口_Java拓展接口-default关键词

Java接口在使用过程中有两点规定:1、接口中只能有定义方法名、方法返回类型,不能有方法的实现。2、实现接口的类,必须实现接口中所有的方法。例如下面的例子://定义接口public interface Action {//接口中的方法定义,只…

java编写通信录管理系统_Java 实现通讯录管理系统教程

本文实例为大家分享了java实现通讯录管理系统的具体代码,供大家参考,具体内容如下完成项目的流程:1.根据需求,确定大体方向2.功能模块分析3.界面实现4.功能模块设计5.coding6.代码测试下面是源代码:import java.awt.Co…

java姑娘_初识java这个小姑娘(二)

正版疯狂java讲义第5版编程教材76.5元(需用券)去购买 >妙解垃圾回收机制周一,早高峰!!!五个字,说尽心中的绝望!!!一段考验一个人耐力、智力、开车技术以及脾气的路。 我把车开进了…

JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑。众所周知,JS是单线程的,即同一时间只能运行一个任务。一般情况下这不会引发问题,但是如果我们有一个耗时较多的任务&#xff0…

mysql update 跳过重复_MySQL通过UPDATE / DELETE整合重复的数据记录

我有一个看起来像这样的表:mysql> SELECT * FROM Colors;╔════╦══════════╦════════╦════════╦════════╦════════╦════════╦════════╗║ ID ║ USERNAME ║ RED ║ GREEN ║ YELLOW ║ …

java目录实用工具_JAVA 创建文件和文件夹,删除文件和文件夹的实用工具

package com.file;import java.io.File;import java.io.IOException;//创建新文件和目录public class CCRDFile {// 验证字符串是否为正确路径名的正则表达式private static String matches "[A-Za-z]:\\\\[^:?\">// 通过 sPath.matches(matches) 方法的返回值判…

java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址//基本数据类型在别处被重新赋值,则本体不受影响,其值不变//引用型数据…

java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色

因此,我下载了“原始”图像(不是正方形),对其进行了修改,使其变为正方形,运行您的代码,得到了java.awt.image.ImagingOpException:无法转换src图像异常,将BufferedImage.TYPE_INT_RGB更改为BufferedImage .TYPE_INT_ARGB并得到…import java.awt.geom.AffineTransfo…

python 数据库连接池_【转】Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会…

python中location_使用python请求模块时的LocationValueError

我一直在使用请求包与Web进行交互,过去没有任何问题 . 最近当使用我大约一周没用过的脚本时,我在执行例程 requests.get() 调用时遇到以下错误:LocationValueError: No host specified.背景研究经过大量的谷歌搜索 python requests LocationV…

java 获取oracle表结构_获取Oracle中所有表的列表?

回答(19)2 years ago我们可以从以下查询获取所有表格,包括列详细信息:SELECT * FROM user_tab_columns;2 years ago使用sqlplus更好地查看如果您正在使用 sqlplus ,您可能需要首先设置一些参数以便在您的列被破坏时更好地查看(退出 sqlplus 会…

java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就…

java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...

/*** * create time [2014-4-13]*/public class Test{public static void main(String args[]){//原有序数组,这里约定数组是升序排列int[] intArray new int[]{1,2,4,6,7,9};int toInsert 8;//待插入数据int subscript 0;//下标//确定下标位置if(toInsert {subscript 0;}e…

php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法

php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用。也适合在thinkphp中清理缓存,在thinkphp中可以把下面代码写入./Application/Admin…

PHP制作订货,PHP生成订单号的两种方法

在开发项目的时候经常有生成订单号的需求&#xff0c;这里列出两种生成20位订单号的常用方法。方法一&#xff1a;以下代码是14位当前时间加6位随机数&#xff0c;如果增减位数&#xff0c;只需修改末尾的数字6即可。<?php Function build_order_no(){return date(YmdHis).…

php 分类排序,php将地区分类排序的算法

php将地区分类排序的算法介绍&#xff0c;有需要的朋友可以参考下。写一个函数&#xff0c;用来存储地区数据&#xff1a;复制代码 代码如下:$array array(0>array("","河北"),1>array("","北京"),2>array(0,"保定&quo…

js读写php文件,在js中如何读取本地文件

下面我就为大家分享一篇js读取本地文件的实例&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如何用在浏览器端预览本地文件&#xff1f;今天的主题是使用浏览器预览本地文件。由于浏览器安全策略的限制&#xff0c;javascript程序不能自由地访问本地资源&…

php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]

PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]简介MVC框架在现在的开发中相当流行&#xff0c;不论你使用的是JAVA,C#,PHP或者IOS&#xff0c;你肯定都会选择一款框架。虽然不能保证100%的开发语言都会使用框架&#xff0c;但是在PHP社区当中拥有最多数量的MVC框架。今天你…

java分页代码思路,记录--java 分页 思路 (hibernate关键代码)

有时会脑袋蒙圈&#xff0c;记录下分页的思路下面代码是hibernate的分页&#xff0c;其分页就是从第几条数据为起点&#xff0c;取几条数据。比如在mysql中的limit(5,10)取的就是第6条到第10条在下面代码中的page是页数、size是每页多少条数据String hql"from User";…

php查看运行时间和内存,php 统计时间和内存的使用情况

跳至/*** 记录和统计时间(微秒)和内存使用情况* 使用方法:** G(begin); // 记录开始标记位* // ... 区间运行代码* G(end); // 记录结束标签位* echo G(begin,end,6); // 统计区间运行时间 精确到小数后6位* echo G(begin,end,m); // 统计区间内存使用情况* 如果end标记位没有定…