1.类的加载,连接和初始化
1.1 JVM和类
同一个JVM的所有线程,所有变量都处于同一个进程里,它们都使用该JVM进程的内存区,当系统出现一下情况,JVM进程将被终止:
1.1.1 程序运行到最后正常结束;
1.1.2 程序运行到System.exit()或Runtime.getRuntime().exit()代码结束程序;
1.1.3 程序运行过程中遇到了未捕获的异常或错误而结束;
1.1.4 程序所在平台强制结束了JVM进程。
当Java程序运行结束时,JVM进程结束,该进程在内存中状态将会丢失。
1.2 类的加载
当程序主动使用某个类时,如果该类未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,统称为类加载或类初始化。
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之创建一个java.lang.Class对象。
系统中所有的类,它们实际上也是对象,它们都是java.lang.Class的实例。
1.3 类的连接
类的连接阶段负责把类的二进制数据合并到JRE中,可分为三个阶段:
1.3.1 验证:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致;
1.3.2 负责:为类的静态属性分配内存,并设置默认初始值;
1.3.3 解析:将类的二进制数据中的符号引用替换成直接引用。
1.4 类的初始化
主要就是对静态属性进行初始化,在Java类中对静态属性指定初始值有两种方式:
1.4.1 声明静态属性时指定初始值;
1.4.2 使用静态初始化块为静态属性指定初始值。
类的初始化一般包括一下几个步骤:
1.4.1 若该类未被加载和连接,程序先加载并连接该类;
1.4.2 若该类的直接父类未被初始化,则先初始化其直接父类;
1.4.3 若该类中有初始化语句,则系统依次执行这些初始化语句。
因此,我们可以推算出,JVM最先初始化的总是java.lang.Object类。当任何一个类被系统使用时,系统会保证该类及所有父类都会被初始化。
1.5 类初始化的时机
当程序首次通过下面6种方式类使用某个类或接口时,系统就会初始化该类或接口;
1.5.1 创建该类的实例。为某个类创建实例的方式包括:
(1)new操作符来创建实例;
(2)通过反射来创建实例;
(3)通过反序列化的方式类创建实例。
1.5.2 调用某个类的静态方法;
1.5.3 访问某个类或接口的静态属性,或为该静态属性赋值;
1.5.4 使用反射方式来强制创建某个类或接口对应的Class对象。如:Class.forName("Person");,如果系统为初始化Person类,则会导致该Person类初始化并返回Person类对应的Class对象。
1.5.5 初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类都会被初始化。
1.5.6 直接使用java.exe命令来运行某个筑垒,当运行某个主类时,程序会先初始化该主类。
另外需要注意一下2点:(1)对于一个final类型的静态属性,如果该属性可以在编译时就得到属性值,则可认为该属性可被当成编译时常量。当程序使用该编译时常量时,系统会认为这是对该类的被动使用,所以不会导致该类的初始化。即相当于使用一个常量。(2)使用ClassLoader类的loadClass方法来加载某个类时,该方法只是加载该类,并不会执行类的初始化。使用Class的forName静态方法才会导致强制初始化该类。
。。。 。。。
分享到:
相关推荐
通过本示例,我们不仅理解了Java反射的基本概念和用途,还学会了如何利用反射动态加载并操作实例类。反射提供了一种灵活的方式来处理类和对象,尤其是在编写框架和插件系统时,能够根据运行时的条件动态地加载和执行...
理解并熟练掌握类加载机制和反射是提升Java开发能力的关键步骤,它们可以帮助我们编写更灵活、更具扩展性的代码,同时也能更好地理解和解决运行时出现的问题。在实际开发中,如Spring框架就大量应用了反射机制,使得...
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...
Java 类加载与反射是Java开发中的重要概念,它们在后端开发中扮演着核心角色,尤其是在框架和库的实现中。下面将详细解释这两个主题。 ### 类加载 #### 类加载器 类加载器是Java虚拟机(JVM)的一个组成部分,它...
在“java 类加载器 加密”这个主题中,我们将探讨如何利用类加载器实现类的加密和解密,以及如何通过反射执行main方法。 首先,我们理解一下类加载器的工作原理。Java中的类加载器主要有三种:Bootstrap ...
在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class<?>`: 这是所有Java类的通用表示,通过`Class....
1. **初始化阶段**: 当Java程序启动时,JVM启动并运行`Bootstrap ClassLoader`,加载Java的核心API,包括`ExtClassLoader`和`AppClassLoader`。 2. **扩展API加载**: `Bootstrap ClassLoader`加载完成后,`...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...
在Java中,反射主要通过`java.lang.Class`类和`java.lang.reflect`包中的几个关键类(如`Constructor`、`Method`和`Field`)来实现。当你在程序运行时获取到一个类的`Class`对象,你就可以获取该类的所有信息,包括...
反射机制和类加载机制是Java编程语言中的两个重要概念。反射提供了强大的运行时元数据操作能力,而类加载机制则确保了类的安全加载和动态管理。深入理解这两个机制对于Java开发者来说至关重要,尤其对于那些从事框架...
根类加载器,也称为bootstrap class loader,是JVM内置的最基础的类加载器,由C++实现,负责加载JDK核心库,如rt.jar,这些库位于JRE的lib目录下,包含了Java的基础类和API。 扩展类加载器,又叫extension class ...
双亲委派模型是Java类加载器的重要特性之一,它的基本流程是:当一个类加载器收到加载类的请求时,它首先不会自己去尝试加载这个类,而是把请求委托给父类加载器去完成,每个层次的类加载器都是如此。如果父类加载器...
动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...
在Java程序运行过程中,类加载器负责将类加载到JVM的内存中,而反射则提供了在运行时检查和操作这些类的能力。 类加载机制是Java虚拟机(JVM)的核心组成部分,它确保在需要时才加载类到内存。当程序启动时,主类...
在Java中,反射是通过java.lang.Class类和java.lang.reflect包中的类来实现的。本篇笔记将深入探讨Java反射的概念、重要性以及如何使用。 一、反射基础 1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类...
- 验证:确保加载的类符合Java虚拟机的规范,例如类结构、语义和字节码操作的合法性,防止恶意代码或不兼容的类库。 - 准备:为类的静态变量分配内存空间并赋予默认初始值,但不包括用户定义的初始值。 - 解析:...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和...通过深入理解和熟练运用类加载和反射机制,开发者可以更灵活地编写代码,解决复杂问题,同时也要注意平衡灵活性和代码的可维护性。
总之,Java的动态类加载机制结合反射API,为开发者提供了强大的工具来应对运行时变化和复杂的需求。理解并掌握这些概念对于编写灵活、可扩展的Java应用至关重要。通过自定义类加载器和利用反射API,我们可以实现更...