加入收藏 | 设为首页 | 会员中心 | 我要投稿 驾考网 (https://www.jiakaowang.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java Review三十九、类加载机制与反射

发布时间:2023-03-13 14:02:45 所属栏目:教程 来源:
导读:目录

类的加载、 连接和初始化

JVM 和类

类的加载

类的连接

类的初始化

类初始化的时机

类加载器

类加载机制

创建并使用自定义的类加载器

URLCIassLoader 类

通过反射查
目录
 
类的加载、 连接和初始化
 
JVM 和类
 
类的加载
 
类的连接
 
类的初始化
 
类初始化的时机
 
类加载器
 
类加载机制
 
创建并使用自定义的类加载器
 
URLCIassLoader 类
 
通过反射查看类信息
 
获得 Class 对象
 
从 Class 中获取信息
 
使用反射生成并操作对象
 
创建对象
 
调用方法
 
访问成员变量值
 
操作数组
 
使用反射生成 JDK 动态代理
 
使用 Proxy 和 InvocationHandler 创建动态代理
 
动态代理和 AOP
 
类的加载、 连接和初始化
 
系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类。
 
JVM 和类
 
当调用 java 命令运行某个 Java 程序时, 该命令将会启动一个 Java 虚拟机进程, 不管该 Java 程序有多么复杂, 该程序启动了多少个线程, 它们都处于该 Java 虚拟机进程里。 同一个 JVM的所有线程、 所有变量都处于同一个进程里, 它们都使用该 JVM 进程的内存区。

在 ATestl.java 程序中创建了 A 类的实例, 并让该实例的类变量 a 的值自加, 程序输出该实例的类变量 a 的值将看到 7。 运行第二个程序 ATest2 时, 程序再次创建了 A 对象, 并输出 A 对象类变量的 a 的值, 此时 a 的值是多少呢? 结果依然是 6,并不是 7。 这是因为运行 ATestl 和 ATest2 是两次运行 JVM 进程, 第一次运行 JVM 结束后, 它对 A 类所做的修改将全部丢失——第二次运行 JVM 时将再次初始化 A 类。

当程序主动使用某个类时, 如果该类还未被加载到内存中, 则系统会通过加载、 连接、 初始化三个步骤来对该类进行初始化。 如果没有意外, JVM 将会连续完成这三个步骤, 所以有时也把这三个步骤统称为类加载或类初始化。
 
类加载指的是将类的 class 文件读入内存, 并为之创建一个 java.lang.class 对象, 也就是说, 当程序中使用任何类时, 系统都会为之建立一个java.lang.class 对象。
 
类的加载由类加载器完成, 类加载器通常由 JVM 提供, 这些类加载器也是前面所有程序运行的基础, JVM 提供的这些类加载器通常被称为系统类加载器。 除此之外, 开发者可以通过继承 ClassLoader基类来创建自己的类加载器。
 
通过使用不同的类加载器, 可以从不同来源加载类的二进制数据, 通常有如下几种来源。
 
从本地文件系统加载 class 文件, 这是前面绝大部分示例程序的类加载方式。
 
从 JAR 包加载 class 文件, 这种方式也是很常见的, 前面介绍 JDBC 编程时用到的数据库驱动类就放在 JAR 文件中, JVM 可以从 JAR 文件中直接加载该 class 文件。
 
通过网络加载 class 文件。
 
把 一 个 Java 源文件动态编译, 并执行加载。
 
类加载器通常无须等到“ 首次使用” 该类时才加载该类, Java 虚拟机规范允许系统预先加载某些类。
  
类的连接
 
当类被加载之后, 系统为之生成一个对应的 Class 对象, 接着将会进入连接阶段, 连接阶段负责把类的二进制数据合并到 JRE 中。 类连接又可分为如下三个阶段:
 
 (1) 验证: 验证阶段用于检验被加载的类是否有正确的内部结构, 并和其他类协调一致。
 
 (2) 准备: 类准备阶段则负责为类的类变量分配内存, 并设置默认初始值。
 
 (3 ) 解析: 将类的二进制数据中的符号引用替换成直接引用。
 
类的初始化
 
在类的初始化阶段, 虚拟机负责对类进行初始化, 主要就是对类变量进行初始化。
 
在 Java 类中对类变量指定初始值有两种方式:
 
① 声明类变量时指定初始值;
 
② 使用静态初始化块为类变量指定初始值。
 

 
 

(编辑:驾考网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章