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 () 构造器被执行");

   }

}


目录
相关文章
|
15天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
2月前
|
Java
Java的反射
Java的反射。
39 2
|
3月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
46 0
[Java]反射
|
4月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
87 9
Java——反射&枚举
|
3月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
36 2
|
4月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
4月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
142 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
3月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
30 0
|
4月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
下一篇
开通oss服务