Class加载机制
Java之所以能够实现跨平台,是因为Java Virtual Machine(Java虚拟机)的优势;简而言之,我们编写的源代码(.java),通过Java编译器编译成为了字节码(.class)文件后,由不同平台相应的JVM通过解释执行;那么字节码(.class)没有变化,变化的是运行在不同平台上的JVM;而通过不同平台上的JVM最终生成可以运行在相应平台上的软件;这样就实现了跨平台。(注意:JVM本身是不跨平台的哟!不同的平台拥有不同的JVM)
Java是面向对象的编程语言,那么Java创建一个对象是如何实现的呢?仅仅是(new)一下这么简单吗?让我们开启JVM的大门,寻找Class加载机制的奥秘!
一、Class加载的过程
1、Class加载:JVM会做这样一件事情,就是找到Class文件,读取Class文件中的内容;
2、Class连接:JVM会做这样三件事情;
1)验证:确保Class文件的正确性 ,为什么还要验证呢?难道Java编译器生成的Class文件不是可靠的吗?这其中的原因就是,JVM为了防止人为的编写错误的Class文件,最终会造成JVM的错误;
2)准备:将Class中的静态变量分配内存,赋予默认值;
3)解析:将Class中的符号引用替换成直接引用。
3、Class初始化:为静态变量赋予正确的初始值。
以上就是一个Class的加载过程,如果仔细了解完后,你会发现一个疑问,为什么在Class连接的准备阶段Class会被赋予“默认值”,而Class初始化再一次赋予“正确的初始值”呢?原因是这样的:
例如:
class Test {
public static int number1;
public static int number2 = 1;
}
number1,number2 在Class连接准备阶段,它们被赋予默认值0,如果是Class类型则为Null;而到Class初始化时,number1的值还是默认值,number2则被重新赋予了1。接下来我们看一个被称为“所以程序员都会犯错的一个实例”:
package com.sean.jvm;
public class Test {
public static void main(String[] args) {
SingleModel singleOBJ = SingleModel.getInstance();
System.out.println("number1==" + singleOBJ.number1);
System.out.println("number2==" + singleOBJ.number2);
}
}
class SingleModel {
private static SingleModel singleClass = new SingleModel();
public static int number1;
public static int number2 = 0;
public SingleModel() {
number1++;
number2++;
}
public static SingleModel getInstance() {
return singleClass;
}
}
你知道结果是多少吗?如果你觉得number1和number2的值都是1那么你就错啦!正确答案是1和0;原因是在SingleModel 类初始化后确定两个属性都自增为1,但是经过静态属性顺序初始化后,number2又被重新赋予了0;所以结果成了1和0;
package com.sean.jvm;
public class Test {
public static void main(String[] args) {
SingleModel singleOBJ = SingleModel.getInstance();
System.out.println("number1==" + singleOBJ.number1);
System.out.println("number2==" + singleOBJ.number2);
}
}
class SingleModel {
public static int number1;
public static int number2 = 0;
private static SingleModel singleClass = new SingleModel();
public SingleModel() {
number1++;
number2++;
}
public static SingleModel getInstance() {
return singleClass;
}
}
如果把“private static SingleModel singleClass = new SingleModel();
”这一句放下来,那结果又会怎样呢?
二、Class加载的触发条件
具体来分析一下Class的加载机制中的加载形式,首先我们需要知道JVM什么时候需要加载Class?
JVM加载Class有两种方式:主动加载、被动加载;
主动加载有六种形式:
1)、new Object();(最常见)
2)、SingleModel.number=0;(使用类中的静态属性时)
3)、SingleModel.getInstance();(使用类中的静态方法时)
4)、Class.forName("com.sean.jvm.Test");(动态加载时)
5)、初始化一个子类时;(一个子类被实例化,那么它的父类也就被加载)
6)、启动类;(含main方法的类)
除以上六种形式之外的Class加载都被称为:被动加载(特点:不会初始化)。
三、Class加载途径
我们在Java开发过程中,Class文件常见的来源是我们自己编写的Java源代码编译后而得到的,还有一种是来自我们引用了他人写好的架包(.jar等压缩包);然而Java不仅仅提供了这两种方式,也可以通过java.net.URLClassLoader这个类从网络上获得Class,来加载到我们的软件中;还可以通过Class专用数据库中提取Class以及采用动态编译Class方式加载Class;是不是对Class加载途径有了新认识呢?
挖掘了Class的加载中的这么多奥秘,发现越挖越多,Class加载器中所蕴含的宝藏还远远不止这些,下一篇会更精彩,欢迎指正!
- 大小: 4.4 KB
分享到:
相关推荐
首先,我们需要理解Java的类加载机制。Java的类加载是通过ClassLoader实现的,每个类在被使用之前都会由ClassLoader查找并加载。ClassLoader有三个基本职责: 1. 加载:寻找并加载类的字节码。 2. 验证:确保加载的...
2. **类的加载过程** - **加载**:类加载是将类的`.class`文件读入内存,并创建一个`java.lang.Class`对象。当使用类时,JVM会经历加载、连接和初始化三个步骤。 - **连接**:连接阶段包括验证、准备和解析。验证...
【JVM】类的奇幻漂流——类加载机制探秘 Java虚拟机(JVM)是运行Java程序的核心组件,它负责将我们编写的类加载到内存中并执行。类加载机制是JVM的一个重要组成部分,它确保了程序的正常运行。本文将带你深入理解...
从JDK 2.0开始,Java引入了一种特殊的类加载策略——父亲委托机制,这一机制保证了类加载过程的稳定性和安全性。 父亲委托机制的核心思想是:当一个类加载器接收到加载类的请求时,它不会立即自己尝试加载,而是把...
本篇文章将深入探讨Java中的类热加载机制以及如何实现。 1. 类加载过程 Java类的加载分为三个阶段:加载、验证、准备、解析和初始化。当类被加载时,类加载器会查找并读取类的字节码文件(.class),将其转换为...
类加载机制负责将Java源代码编译成的.class文件转换为内存中的数据结构,以便程序可以执行。本篇将深入探讨类加载机制的原理和过程。 1. **类的加载阶段** 类的加载是类生命周期的起始阶段,它包括以下步骤: - ...
类加载器是实现类加载过程的关键角色,主要有四种类型的类加载器: - **引导类加载器**(Bootstrap ClassLoader):负责加载JVM运行必需的核心类库,如rt.jar,这部分由C++实现,不在Java代码中直接可见。 - **...
例如,理解类加载机制可以帮助开发者避免类冲突,设计更高效的类加载策略,以及处理动态加载和热部署等问题。因此,深入理解JVM的工作原理,特别是类加载与连接过程,对于提升Java开发技能具有重要意义。
Java类加载机制是Java技术体系中的重要组成部分,它关乎到程序运行时的类查找与实例化。当遇到`java.lang.ClassNotFoundException`这类异常时,往往与类加载有关。本文将详细解析Java类加载原理,分为三篇文章进行...
在处理大量图片时,可能需要优化加载过程,避免一次性加载所有图片导致内存占用过高。可以使用懒加载策略,只在需要时才加载图片。此外,还可以使用缓存来存储已加载的图片,提高性能。 总的来说,理解和掌握Applet...
### Android LRUCache机制详解 #### 一、LRUCache简介 在Android开发过程中,缓存技术是一项重要的优化手段,可以显著提升应用性能并改善用户体验。LRUCache(Least Recently Used Cache,最近最少使用缓存)是一种...
Java的类加载机制是动态的,这意味着它不会一开始就加载所有的类,而是在程序运行过程中按需加载。这样做的主要目的是为了节省内存资源,并提高程序的运行效率。类加载的过程大致可以分为以下几个阶段: - **装载...
Java的类加载机制遵循双亲委派模型,即从顶层的启动类加载器开始,向下逐级加载。这样可以防止类的冲突,并确保核心库的安全性。 在深入学习ClassLoader时,我们需要理解类加载的生命周期,包括加载、验证、准备、...
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
Java 类加载机制是Java技术体系中的重要组成部分,它负责将类的字节码文件从磁盘、网络或其他数据源加载到Java虚拟机中,然后转化为运行时的数据结构。理解这一机制对于解决程序中出现的如`java.lang....
自定义类加载器可以继承抽象类java.lang.ClassLoader,并重写findClass()方法来实现自定义的类查找和加载机制。使用自定义类加载器可以用于实现类隔离、热替换代码等高级功能。 类加载器的设计允许Java应用使用多...
当遇到新的类引用时,JVM会通过类加载器查找对应的`.class`文件并加载到内存中。 5. **字节码验证**:JVM在运行字节码之前会进行安全检查,确保代码不会执行恶意操作。 6. **解释与优化**:早期的JVM是完全解释...
自动加载机制极大地提高了代码的可维护性和效率。以下是对PHP自动加载机制的深入分析: 1. 手动加载: 在PHP中,最基础的加载类文件的方式是使用`require`,`include`,`require_once`和`include_once`。这些函数...
在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的结构信息,如类名、方法、字段等,并能在运行时动态地创建对象、调用方法。 字符串在Java中扮演着重要...