Java反射(三)类加载

简介: 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载

三.类加载

1.动态加载和静态加载

  • 基本说明
    反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载

1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强

2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性

3.举例说明

  • 类加载时机
    1.当创建对象时(new))2.当子类被加载时3.调用类中的静态成员时4.通过反射Class.forName("com.test.Cat");

2.类加载流程图

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 类加载各阶段完成任务
    网络异常,图片无法展示
    |

3.类加载的五个阶段

3.1加载阶段

  • JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件、也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class对象

3.2连接阶段

3.2.1验证

1.目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。2.包括:文件格式验证(是否以魔数oxcafebabe开头)、元数据验证、字节码验证和符号引用验证3.可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间。

3.2.2准备

JVM会在该阶段对静态变量,分配内存并初始化(对应数据类型的默认初始值如0、0L、null、false等)。这些变量所使用的内存都将在方法区中进行分配

/**

* @author LeeZhi

* @version 1.0

* 我们说明一个类加载的连接阶段-准备

*/

publicclassClassLoad02 {

   publicstaticvoidmain(String[] args) {

   }

}

classA{

   //属性-成员变量-字段

   //分析类加载的连接阶段-准备  属性是如何处理

   //1. n1 是实例属性,不是静态变量,因此在准备阶段,是不会分配内存

   //2. n2 是静态变量,分配内存n2是默认初始化0,而不是20

   //3. n3 是static final是常量,他和静态变量不一样,因为一旦赋值就不变 n3 = 30

   publicintn1=10;

   publicstaticintn2=20;

   publicstaticfinalintn3=30;

}

3.2.3解析

虚拟机将常量池内的符号引用替换为直接引用的过程。

3.3初始化

  • Initialization(初始化)
    1.到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行<clinit>()方法的过程。2.<clinit>()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并。3.虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动饯程执行<clinit>()方法完毕[debug源码]

/**

* @author LeeZhi

* @version 1.0

* 演示类加载-初始化阶段

*/

publicclassClassLoad03 {

   publicstaticvoidmain(String[] args) {

       //1 加载B类,并生成B的class对象

       //2. 链接num=0

       //3. 初始化阶段

       //依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句

       /*

           clinit(){

               System.out.println("B静态代码块被执行");

               //num=300:

               num=100;

           }

           合并:num = 100

        */

       //4. "B () 构造器被执行"

       //new B();//类加载

       System.out.println(B.num);//100  如果直接使用类的静态属性,也会导致类的加载

   }

}

classB{

   static {

       System.out.println("B 静态代码块被执行");

       num=300;

   }

   staticintnum=100;

   publicB(){

       System.out.println("B () 构造器被执行");

   }

}


目录
相关文章
|
24天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
16 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
62 9
Java——反射&枚举
|
1月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
112 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
2月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
2月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
3月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
29 0