深入理解反射机制

Java代码在计算机中经历的三个阶段

在这里插入图片描述
阶段一:Source源代码阶段。意味着经过编译器编译后生成的.class文件还没有加载进内存,还是在硬盘上。

现在字节码要想变成对象,而对象是内存里边,也就是说需要把字节码加载进内存后才能够有这个对象。

阶段二:Class类对象阶段。该阶段需要把字节码文件加载进内存的,有一个东西,能够把字节码文件加载进内存,这个东西称为类加载器(对应着Java里的一个对象,ClassLoader)。这个类加载就可以把Person.class文件加载到内存里边。

那在内存里边怎么描述Person.class字节码文件呢?

在Java里边万物皆对象,所以在内存里边有个对象来描述这个字节码文件,这个对象就是Class类对象(在Java里边有个Class类,这个Class类就是用来描述所有字节码文件的共同特征和行为)。
不管是什么字节码文件,里边都有成员变量、构造方法、普通方法、成员方法等。因此Class类对象里边有三个重要的部分,第一、所有成员变量,第二、构造方法,第三、成员方法。这三个部分都封装成其他的对象,如成员变量封装为Field对象,构造方法封装为Constructor对象,成员方法封装为Method对象。一个.class字节码文件里边可能有多个成员变量、构造方法或成员方法,所以分别用Field[] feilds数组来描述所有的成员变量,构造方法跟成员方法也一样。那这就是Class类对象。后面通过Class类对象的一些行为就可以创建真正的Person对象。

阶段三:Runtime运行时阶段。该通过new Person()生成的对象去调用该对象的方法。

知道这个三个阶段后,再回来看反射的概念。

摘自百度百科

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

摘自Java黑马57期学习笔记

反射:将类的各个组成部分封装为其他对象,这就是反射机制。

  • 好处:
    1. 可以在程序运行过程中,操作这些对象。
    2. 可以解耦,提高程序的可扩展性。

再来理解下,可以在程序运行过程中,操作这些对象这句话。

应用反射的例子
在这里插入图片描述
这是IDEA中写的一小段代码,定义一个字符串s,IDEA本身就是个程序,而且是用Java开发的应用程序。那么现在定义的字符串s.操作后,会有一大堆的方法提示,那这些方法从哪儿来的,怎么知道有这些方法呢!这其实就是内部用到了反射机制。

IDEA是这样做的,你定义了字符串s,那IDEA会把字符串这个字节码文件加载进内存,在内存中有Class类对象,Class类对象已经把所有的方法抽取出来了,封装为Method对象,然后把所有方法放到Method[] method数组中,那将来要提示,我们只需要将Method数组里的每一个成员拿出来展示到列表里就可以了。IDEA这个程序一直是在运行的状态,在运行的过程中我们能知道这个字段的对象里边有哪些方法。

通过上述的过程,就有个较为直接地感受到反射机制带来的应用了。

—end

猜你喜欢

转载自blog.csdn.net/sgx5666666/article/details/108420013