java中JVM加载类的时机

一、描述

java中的类在什么时候被JVM虚拟机加载呢?因为静态成员初始化的时候会在类首次加载的时候执行, 我们通过测试一个静态代码块的执行时间来判断JVM加载该类的时间。

总结:JVM只在需要某个类或者使用Class.forName(className)强制加载类的时候才会被调用,如果只是声明某个类的引用,而没有创建对象则不会加载该类。

二、源代码

1、只是声明某个类的引用,而没有创建对象则JVM不会加载该类

package tong.yue.day4_25;

/**
 * java中的类在什么时候被JVM虚拟机加载呢?因为静态成员初始化的时候会在类首次加载的时候执行,
 * 我们通过测试一个静态代码块的执行时间来判断JVM加载该类的时间。
 * 总结:JVM只在需要某个类或者使用Class.forName(className)强制加载类的时候才会被调用。
 *
 * @author tong
 *
 */
class LoadClass {
	static {
		System.out.println("JVM载入类...");
	}
	public static int height = 30;

	public static void print() {
		System.out.println("执行print()函数...");
	}

}

public class LoadClassTest {
	public static void main(String[] args) {
		//只声明某个类的引用,而没有创建对象则JVM不会加载该类
		LoadClassTest loadClass;

	}
}

以上代码在执行的时候不会输出任何东西,也不会执行静态代码块,所以确认只声明某个类的引用,而没有创建对象则JVM不会加载该类。

2、只要创建了类的对象,或者使用类的静态成员变量、或者使用类的静态方法都会使得JVM加载该类


package tong.yue.day4_25;
/**
 * java中的类在什么时候被JVM虚拟机加载呢?因为静态成员初始化的时候会在类首次加载的时候执行,
 * 我们通过测试一个静态代码块的执行时间来判断JVM加载该类的时间。
 * 总结:JVM只在需要某个类或者使用Class.forName(className)强制加载类的时候才会被调用。
 *
 * @author tong
 *
 */
class LoadClass {
	static {
		System.out.println("JVM载入类...");
	}
	public static int height = 30;

	public static void print() {
		System.out.println("执行print()函数...");
	}

}

public class LoadClassTest {
	public static void main(String[] args) {
		//只有有下面三句中的其中任意一句,该类就会被JVM加载,并输出一次:JVM载入类...
		LoadClass loadClass = new LoadClass();  //1
		System.out.println(LoadClass.height);   //2
		LoadClass.print();                      //3

	}
}
运行结果:

3、使用Class.forName(className)方法强制JVM加载该类,如果该类还没有被JVM加载,那么JVM就会载入该类,若该类已经加载了就不会再加载。

package tong.yue.day4_25;

/**
 * java中的类在什么时候被JVM虚拟机加载呢?因为静态成员初始化的时候会在类首次加载的时候执行,
 * 我们通过测试一个静态代码块的执行时间来判断JVM加载该类的时间。
 * 总结:JVM只在需要某个类或者使用Class.forName(className)强制加载类的时候才会被调用。
 *
 * @author tong
 *
 */
class LoadClass{
	static {
		System.out.println("JVM载入类...");
	}
	public static int height = 30;

	public static void print() {
		System.out.println("执行print()函数...");
	}

}

public class LoadClassTest {
	public static void main(String[] args) {

		//使用Class.forName(className)方法强制JVM加载该类,里面的参数是该类的完整路径:包名+类名
		try {
			Class.forName("tong.yue.day4_25.LoadClass");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
}

运行结果:

三、总结

1. JVM加载类是一种懒加载的模式,只有在需要某个类的时候才会加载,只是声明某个类的引用而不创建对象的时候是不会加载的;

2. 当程序中创建该类的对象,或者没有创建该类对象但是调用该类的静态方法,或者使用该类的静态成员的时候,JVM就会加载该类;

3. 当程序中使用Class.forName(className)来强制JVM加载某个类的时候,如果该类还没有被JVM加载,那么JVM就会载入该类,若该类已经加载了就不会再加载。

时间: 2024-12-26 11:50:36

java中JVM加载类的时机的相关文章

JVM加载类的过程,双亲委派机制中的方法

JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进制字节流,并将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,最后在Java堆中生成一个代表这个类的java.lang.Class对象作为方法区这些数据的访问入口.相对于类加载过程的其他阶段,加载阶段是开发期可控性最强的阶段.我们可以通过定制不通的类加载器,也就是ClassLoader来控制二进制

Java 从Jar文件中动态加载类

由于开发的需要,需要根据配置动态加载类,所以简单测试了一下JAVA动态加载类 定义接口 package loader; public interface HelloIface {     public String hello();          public String sayHi(); } 实现接口 在其他插件类实现此接口,并导出为jar,如D:/tmp/test.jar package loader; public class HelloImpl implements HelloIf

jvm加载类

作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象.我们可以猜想下jvm加载类的过程:class文件有规定的格式,jvm去解析class文件流,读magic, major version, minor version等值(最简单的举例),然后生成Klass对象,并放到一个map中. 首先有个全局的认识,jvm把已加载的类放在一个hashtable中.class SystemDictionary : AllStatic {    // Hashtabl

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

jvm加载类的过程

前言: 说下这篇文章的来龙去脉:昨天接到了阿里小哥哥的面试电话,小哥哥问我jvm加载类的过程.然后我巴拉巴拉说了一堆classLoader装载类的过程.然后小哥哥说我不是要问这些...好吧装载加载傻傻分不清楚. jvm加载类过程(本人不会,以下内容由小哥哥解释给我听的): classLoader装载类 连接(包括验证,准备,解析:小哥哥详述了这三个步骤..因为我比较疑问哈哈哈) 初始化 (小哥哥开始问我这个具体初始化过程) ( 本人其实脑子一片浆糊,很多概念傻傻分不清除)比如:类的初始化和对象的

php中自动加载类_autoload()和spl_autoload_register()实例详解

一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例news类而没有引入该类,可以用_autoload自动加载方法类去处理. news.class.php文件 class news{ function do_new() { echo 'aaa'; } } auto.php文件使用_autoload函数要定义函数体自己去定义 function __au

[转载] Java中动态加载jar文件和class文件

转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍

JVM加载类的原理机制

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.链接和初始化,其中链接又可以分成校验.准备.解析装载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性: 准备:给类的静态变量分配并初始化存储空间: 解析:将符号引用转成直接引用:初始化:激活类的静态变量,初始化Java代码和静态Java代码块

虚拟机(JVM)如何加载类

首先JVM加载类的一般流程分三步: 加载 链接 初始化 那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发.Java分基本类型和引用类型.其中按照面向对象的特性,一切皆对象,那么对于基本类型也应该是对象.但是为了在执行效率和内存占用上进行调优,Java将基本类型特殊处理.所以Java基本类型加载都是Java虚拟机预先定义好了,所以没有加载这个步骤了.引用类型就是类,接口,数组.其中数组是直接由虚拟机直接生成的.类和接口是字节流,都是需要加载. 正文 Java基本