java 类的加载、连接和初始化
JVM和类
调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:
- 程序运行到最后正常结束;
- 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序;
- 程序运行过程中遇到未捕获的异常或错误而结束;
- 程序所在的平台强制结束了JVM进程。
类的加载
当程序主动使用某个类时,如果该类还没有被加载到内存中,系统会通过加载、连接、初始化这三个步骤来对该类进行初始化(如果没有意外,JVM将会连续完成这三个步骤,所以有时也会把这三个步骤统称为类的加载或初始化)。
类的加载是指将类的class文件读入内存,并为之创建一个java.lang.Class对象(注意并不是目标类的对象)。也就是说当程序中使用任何类时都会为之创建一个java.lang.Class对象。
类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是Java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。
通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种数据来源:
- 从本地文件系统加载class文件;
- 从jar包中加载class文件;
- 通过网络加载class文件;
- 把一个Java源文件执行动态编译,并执行加载。
java通常无需等到“首次使用”该类时才加载该类,Java虚拟机允许系统预先加载某些类。
类的连接
当类被加载后,系统会为之生成一个对应的Class对象,接着就会进入类的连接阶段。
类的连接阶段负责把类的二进制数据合并到JRE中。类的连接又可以分为如下三个阶段:
- 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致;
- 准备:类的准备阶段则负责为类的静态属性分配内存,并设置默认初始值;
- 解析:将类的二进制数据中的符号引用替换成直接引用。(关于符号引用和直接引用我觉得这里说的非常明白)
类的初始化
在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。在java类中对静态属性进行初始化有两种方式:
- 声明静态属性时指定初始值;
- 使用静态初始化块为静态属性指定初始值。
进行初始化时,JVM会按语句在程序中的排列顺序依次执行初始化。如下面的代码,最终b的值为9。
package com.zhyea.test;public class Test {static{b=6;}static int a = 0;static int b = 9;}
JVM对类进行初始化时包含如下步骤:
- 假如这个类还没有被加载和连接,程序先执行加载并连接这个类;
- 假如该类的直接父类还没有被初始化,则先初始化其直接父类;
- 假如类中有初始化语句,则系统依次执行这些初始化语句。
根据如上步骤可以看出来,当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。
类初始化的时间
系统开始初始化类或接口的时间包括一下6种情况:
- 创建类的实例;
- 调用某个类的静态方法;
- 访问某个类或接口的静态属性,或为该静态属性赋值;
- 通过反射方式来创建某个类或接口对应的java.lang.Class对象,如使用Class.forName(“Person”);
- 初始化某个类的子类。初始化子类时,所有的父类都会被初始化;
- 直接使用java命令来运行某个类时。
需要一提的是final修饰的静态属性,如final修饰的静态属性在编译时就得到了属性值,那么该静态属性就会被当作常量不会被初始化(类的编译做了哪些事情呢,这里需要考虑下)。如下面这种情况:
final static int MON = 1;
final修饰的静态属性未能在编译时得到属性值,那么就会被初始化,如下面这种情况:
final static int TUE = 1+1;
还值得一提的就是ClassLoader的loadClass方法并不会执行类的初始化,而是只执行了类的加载。
转载于:https://www.cnblogs.com/amunote/p/4170627.html
java 类的加载、连接和初始化相关推荐
- 类的加载连接和初始化
类的加载.连接和初始化 当Java程序中需要使用到某个类时,虚拟机会保证这个类已经被加载.连接和初始化.而连接又包含验证.准备和解析这三个子过程,这个过程必须严格的按照顺序执行. 类的加载 通 ...
- [置顶]类的加载连接初始化
自己是在看视频的过程中看到一个比较有意思的面试题然后学习了一下关于jvm中类的加载连接和初始化部分的内容,感觉很有收获,所以在博客中记录一下. 首先贴代码: class SingleTon {publ ...
- 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器
28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...
- Java深度历险(二)——Java类的加载、链接和初始化
在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行.本文接着上一篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式 ...
- java类的加载,链接,初始化
Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始 ...
- 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析
前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...
- 深入理解Java虚拟机:Java类的加载机制
本篇内容包括:Java 类的加载机制(Jvm 结构组成.Java 类的加载).类的生命周期(加载-验证-准备-解析-初始化-使用-卸载).类加载器 以及 双亲委派模型. 一.Java 类的加载机制 1 ...
- Java 类的加载过程
Java 类的加载过程 当程序主动使用某个类时,如果该类还没有加载到内存中,则通过以下三个步骤对类进行加载初始化: 类的加载:将类的class文件读入内存,并为之创建一个java.lang.Class ...
- 透过现象看本质:Java类动态加载和热替换
摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...
最新文章
- Global.asax中Application_Error无法执行
- UNIX网络编程--ioctl操作(十七)
- Oracle查询会话连接数
- Django环境搭建
- LeetCode——动态规划:斐波那契数列
- apache camel_轻量级的开源集成:Apache Camel还是Spring集成?
- QML工作笔记-2种输入框的使用(TextField与TextInput)
- Vue 组件 style scoped
- java中的step_Java中finalize()
- 十一、接口(接口的概念,实现,继承,实现)、抽象类与抽象方法(抽象类,抽象方法概念,使用)...
- safari里的touch事件解析
- Html和Css学习笔记-html进阶-div与span
- java中ImageIcon路径问题
- APP性能---用adb命令测试Android中APP的FPS
- 樊登读书会用事实说话读后感_用事实说话樊登读书笔记
- Monkey测试------报错日志分析参考
- Oracle Sqlplus显示不足问题
- python画分布图(hist)等等
- Win10 收件箱添加QQ邮箱(2019年5月19日)
- 史上最简单的无缝衔接轮播图
热门文章
- web前端常用代码于面试等资源
- linux下ssh通过公钥登录服务器
- 【我的Android进阶之旅】Android自定义Lint实践
- 2017 Material design 第二章第六节《富有创造性的定制方案》
- tomcat限制用域名访问 禁止 ip访问
- linux下配置samba服务器(以CentOS6.7为例)
- 理解UI线程——SWT, Android, 和Swing的UI机理
- iView 实战系列教程(21课时)_2.iView 实战教程之导航、路由、鉴权篇
- js中 给json对象添加属性和json数组添加元素
- vue子父组件间传值