原文地址:https://juejin.im/post/5b2f8bd2f265da59b457cf47

作者:YangAM

小结:

反射就是指程序在运行时能够动态的获取到一个类的类型信息的一种操作。

获取一个 Class 对象的方法主要有以下三种。 类名.classgetClass 方法forName 方法

https://cdn.nlark.com/yuque/0/2019/png/576791/1577726036088-cecfbb3b-7adf-4b75-ac63-33e15124ee84.png#align=left&display=inline&height=692&originHeight=692&originWidth=1405&size=0&status=done&style=none&width=1405

图片来自 https://www.cnblogs.com/fengmingyue/p/5973260.html

『反射』就是指程序在运行时能够动态的获取到一个类的类型信息的一种操作。它是现代框架的灵魂,几尽所有的框架能够提供的一些自动化机制都是靠反射实现的,这也是为什么各类框架都不允许你覆盖掉默认的无参构造器的原因,因为框架需要以反射机制利用无参构造器创建实例。

总的来说,『反射』是很值得大家花时间学习的,尽管大部分人都很少有机会去手写框架,但是这将有助于你对于各类框架的理解。不奢求你通过本篇文章的学习对于『反射』能够有多么深层次的理解,但至少保证你了解『反射』的基本原理及使用。

1. Class 类型信息

之间介绍过虚拟机的类加载机制,其中我们提到过,每一种类型都会在初次使用时被加载进虚拟机内存的『方法区』中,包含类中定义的属性字段,方法字节码等信息。

Java 中使用类 java.lang.Class 来指向一个类型信息,通过这个 Class 对象,我们就可以得到该类的所有内部信息。而获取一个 Class 对象的方法主要有以下三种。

类名.class

这种方式就比较简单,只要使用类名点 class 即可得到方法区该类型的类型信息。例如:

Object.class;
Integer.class;
int.class;
String.class;
//等等

getClass 方法

Object 类有这么一个方法:

public final native Class<?> getClass();

这是一个本地方法,并且不允许子类重写,所以理论上所有类型的实例都具有同一个 getClass 方法。具体使用上也很简单:

Integer integer = new Integer(12);
integer.getClass();
复制代码

forName 方法