详解JAVA类加载机制
JAVA源码编译由三个过程组成:
1、源码编译机制。
2、类加载机制
3、类执行机制
我们这里主要介绍编译和类加载这两种机制。
一、源码编译
代码编译由JAVA源码编译器来完成。主要是将源码编译成字节码文件(class文件)。字节码文件格式主要分为两部分:常量池和方法字节码。
二、类加载
类的生命周期是从被加载到虚拟机内存中开始,到卸载出内存结束。过程共有七个阶段,其中到初始化之前的都是属于类加载的部分
加载----验证----准备----解析-----初始化----使用-----卸载
系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类,当运行某个java程序时,会启动一个java虚拟机进程,两次运行的java程序处于两个不同的JVM进程中,两个jvm之间并不会共享数据。
1、加载阶段
这个流程中的加载是类加载机制中的一个阶段,这两个概念不要混淆,这个阶段需要完成的事情有:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在java堆中生成一个代表这个类的Class对象,作为访问方法区中这些数据的入口。
由于第一点没有指明从哪里获取以及怎样获取类的二进制字节流,所以这一块区域留给我开发者很大的发挥空间。这个我在后面的类加载器中在进行介绍。
2、准备阶段
这个阶段正式为类变量(被static修饰的变量)分配内存并设置类变量初始值,这个内存分配是发生在方法区中。
1、注意这里并没有对实例变量进行内存分配,实例变量将会在对象实例化时随着对象一起分配在JAVA堆中。
2、这里设置的初始值,通常是指数据类型的零值。
private static int a = 3;
这个类变量a在准备阶段后的值是0,将3赋值给变量a是发生在初始化阶段。
3、初始化阶段
初始化是类加载机制的最后一步,这个时候才正真开始执行类中定义的JAVA程序代码。在前面准备阶段,类变量已经赋过一次系统要求的初始值,在初始化阶段最重要的事情就是对类变量进行初始化,关注的重点是父子类之间各类资源初始化的顺序。
java类中对类变量指定初始值有两种方式:1、声明类变量时指定初始值;2、使用静态初始化块为类变量指定初始值。
初始化的时机
1)创建类实例的时候,分别有:1、使用new关键字创建实例;2、通过反射创建实例;3、通过反序列化方式创建实例。
1
2
|
new Test();
Class.forName(“com.mengdd.Test”);
|
2)调用某个类的类方法(静态方法)
1
|
Test.doSomething();
|
3)访问某个类或接口的类变量,或为该类变量赋值。
1
2
|
int b=Test.a;
Test.a=b;
|
4)初始化某个类的子类。当初始化子类的时候,该子类的所有父类都会被初始化。
5)直接使用java.exe命令来运行某个主类。
除了上面几种方式会自动初始化一个类,其他访问类的方式都称不会触发类的初始化,称为被动引用。
1、子类引用父类的静态变量,不会导致子类初始化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class SupClass
{
public static int a = 123 ;
static
{
System.out.println( "supclass init" );
}
}
public class SubClass extends SupClass
{
static
{
System.out.println( "subclass init" );
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println(SubClass.a);
}
}
|
执行结果:
supclass init
123
2、通过数组定义引用类,不会触发此类的初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class SupClass
{
public static int a = 123 ;
static
{
System.out.println( "supclass init" );
}
}
public class Test
{
public static void main(String[] args)
{
SupClass[] spc = new SupClass[ 10 ];
}
}
|
执行结果:
3、引用常量时,不会触发该类的初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class ConstClass
{
public static final String A= "MIGU" ;
static
{
System.out.println( "ConstCLass init" );
}
}
public class TestMain
{
public static void main(String[] args)
{
System.out.println(ConstClass.A);
}
}
|
执行结果:
MIGU
用final修饰某个类变量时,它的值在编译时就已经确定好放入常量池了,所以在访问该类变量时,等于直接从常量池中获取,并没有初始化该类。
初始化的步骤
1、如果该类还没有加载和连接,则程序先加载该类并连接。
2、如果该类的直接父类没有加载,则先初始化其直接父类。
3、如果类中有初始化语句,则系统依次执行这些初始化语句。
在第二个步骤中,如果直接父类又有直接父类,则系统会再次重复这三个步骤来初始化这个父类,依次类推,JVM最先初始化的总是java.lang.Object类。当程序主动使用任何一个类时,系统会保证该类以及所有的父类都会被初始化。
转载于:https://www.cnblogs.com/zenobiaf/p/10019985.html
详解JAVA类加载机制相关推荐
- java加载机制_详解Java类加载机制
一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机. HotSpot JVM结构,图片来自Java Garbage Collection Bas ...
- 详解JVM类加载机制
详解JVM类加载机制 笔者的笔记都记录在有道云里面,因为公司原因办公电脑无法使用有道云,正好借此机会整理下以前的笔记顺便当做巩固复习了,也因为记笔记的时候不会记录这些知识来源何地,所以如果发现原创后可 ...
- 详解Java反射机制
一.什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的类的内部信息,包括其方法( ...
- 详解Java反射机制------入门篇
一.什么叫Java反射机制? Java中的反射机制是指在运行状态中,对于任意一个类,能够动态获取这个类中的属性和方法:对于任意一个对象,都能够任意调用它的属性和方法.这种动态获取类的信息以及动态调用对 ...
- 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】
Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...
- java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法
前言 大家应该都知道,当一个Java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载.验证.准备.解析.初始化 ...
- java 动态绑定原理_详解Java动态绑定机制的内幕(图)
在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...
- Java类加载机制详解【java面试题】
Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...
- 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。
目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...
最新文章
- 高通linux内核目录,高通 android 源代码以及目标系统目录结构
- php array product,PHP array_product()用法及代码示例
- SendMessage、PostMessage原理和源代码详解
- ajax上送src,使用script的src实现跨域和类似ajax效果
- android用单元测试的多,AndroidStudio中对Android应用进行单元测试InstrumentationTestCase...
- 最新数据库设计实战应用案例--合同管理系统 非常经典的数据库设计案例教学 数据库设计
- centos7.2下安装php7.1缺少依赖包汇总(初稿)
- STC 串口下载电路 - CH340G或CH340N USB转串口以及漏电隔离
- C#与宇电温控表自定义协议通信实例
- 如何实现实时音视频聊天功能
- matlab 线性最小二乘法,求解线性方程组 - 最小二乘法
- 安装Tomcat详细步骤
- 【菜鸡的自动化学习之旅】《电力电子技术》学习笔记1 ———— 电力电子器件
- Ray:一个分布式应用框架
- Unity开发4 资源、商店、地形的绘制
- 图片全屏查看js插件
- macbook pro M1 外接4K显示器模糊
- 疫情期间居家办公软件参考
- Android录音-SoundTouch移植到Android
- 有个清华妈妈的教育方法值得借鉴