Java 中反射的介绍

140 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

这篇文章,我们从基本概念开始讲起,说说java 中的反射机制。

什么是静态语言和动态语言

在了解的反射机制之前,我们首先要弄懂什么是动态语言,什么是静态语言,同时要清楚二者之间的差别。

静态语言比较好说明,就是代码在运行期间,其结构是不可以改变的。比如java,c 语言,c++ 等等。

动态语言和静态语言正好相反,其在运行时,是可以改变结构的。可能“改变结构”对读者来说比较抽象,举个例子来讲,就比如说添加新的函数、对象,引入新的代码。这些都是动态语言才可以办得到的事情。另外,如果开发者想删除一个已有的函数,这也是可以的。

总结来说,它们两个特点就是看语言在运行的时候,代码是不是可以根据某些条件来改变自身结构。比如说c#,python,php,js 等等,这些都是典型的动态语言。

上面我们说了,对于java 来说,它不是动态语言,却是一种“准动态语言”。这是由java 自带“反射机制”而带来的功能。利用java 的反射机制,我们可以获得到类似于动态语言的特性,这样在开发的时候就可以更加灵活。

反射机制是什么

在了解了动态语言与静态语言的区别的基础上,我们来说一下什么是反射机制。

从上文得知,java 因为有了“反射”,所以可以有了“动态语言”的特性。

那么既然有“反射”机制的存在,我们自然可以想到,也一定会有“正射”机制的存在。

什么是正射呢?我们举例来看一下:

List<Integer> list = new ArrayList();

这种在编写代码期间,根据类的定义,来new 出一个对象,就是正射的操作。

对于反射,它的操作就是在程序运行期间,通过Reflection API 来取得类内部的任何信息,同时通过这个API,可以直接去操作任何对象的内部属性或者方法。

关于Reflection API,我们依旧举个例子看一下:

Class clazz = Class.forName("java.util.List");
Class clazz1 = List.class;
Class clazz2 = list.getClass();

(这里别弄混了:class 是在声明一个类时的时候使用到的关键字;而Class 是一个类的类型。)

程序在执行并加载完成之后,就会在方法区产生一个Class 类型的对象(类的类型的对象)。关于这个对象,它包含了这个类的完整的结构信息,如:所有的字段方法、构造函数等等。

有了这个类的对象之后,我们就可以看到这个类的结构上的信息。

于是乎,我们就可以想到,关于反射,就是在运行期间,通过一个对象及Reflection API,或者这个类的完整的结构信息。

所以说,关于这个对象就像一面镜子。通过这个镜子,来得到类的具体的结构及类内部的所有信息。于是我们就可以理解“反射”这个词了。

总结

下面我们通过一张图来看明白“反射”的机制:

image.png