接前一篇文章: QEMU源码全解析 —— 块设备虚拟化(4)
本文内容参考:
《趣谈Linux操作系统》 —— 刘超,极客时间
《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社
【Java】反射基础(Class类)_class 反射-CSDN博客
特此致谢!
QEMU初始化阶段的块设备虚拟化
从模板生成类和类的实例化
上一回在讲解QEMU中类继承机制的时候,讲到了从模板(TypeImpl)生成类(xxxClass),和类的实例化。本回还要对于与类继承机制更为契合的概念进行知识补强 —— Java反射。
知识补强 —— Java反射
1. 什么是反射
Java反射(Reflection)是Java语言的一个核心特性 ,它允许运行中的Java代码对自身进行 自我检查 、甚至 修改自身 的组件。具体来说,反射机制提供了 在运行状态中,对于任意一个类,都能够了解这个类的所有属性和方法 ; 对于任意一个对象,都能够调用它的任意一个方法和属性 。这种 动态获取的信息以及动态调用对象的方法 在Java中就叫做反射。
一句话总结:反射就是 在运行时才具体知晓要操作的类是什么结构,并在运行时获取类的完整构造,并调用对应的方法、属性 等。
2. 为什么要用反射
Java Reflection功能非常强大,并且非常有用,比如:
-
获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
-
获取任意对象的属性,并且能改变对象的属性
-
调用任意对象的方法
-
判断任意一个对象所属的类
-
实例化任意一个类的对象
-
通过反射实现动态装配,降低代码的耦合度,实现动态代理等
3. 反射的组成
Java的反射主要包括以下三个部分:
(1)类的加载
Java的类在需要使用时才会被加载到JVM中。这个过程是由类加载器(ClassLoader)完成的。类加载器首先检查这个类是否已经被加载过,如果还没有加载,那么就会从磁盘上加载类的字节码并创建一个Class对象。
(2)获取类的信息
当一个对象被创建后,可以使用反射来获取这个对象的Class对象。通过这个Class对象,可以获取到这个类的所有属性和方法。
(3)方法的调用
通过反射,我们可以动态的调用一个对象的方法。即使这个方法是一个私有的方法,也能够通过反射来调用。
4. 反射的使用
在Java中,Class类与java.lang.reflect类库配合对反射技术进行了完整的支持。在反射的Package中,我们经常使用功能类如下:
-
Constructor类表示的是Class对象所表示的类的构造方法,利用它可以在运行时动态创建对象
-
Field类表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性值(包含private)
-
Method类表示Class对象所表示的类的成员方法,通过它可以动态调用对象的方法(包含private)
5. 反射的调用流程
(1)编写完Java项目之后,java文件都会被编译成一个.class文件;
(2)这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象;
(3)通过Class对象获取 Field(属性)、Method(方法)、Construcor(构造函数)。平时通过new的形式创建对象,本质上就是通过Class来创建一个新对象。
至此,对于Java反射(Reflection)机制的知识补强就完成了。下一回对照Java反射的机制和调用流程,讲解QEMU中的相关类继承代码。