部分内容来自黑马程序员和JavaGuide,可以先了解一下类加载和类加载器的知识。
来自文档的解释:
Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program. For example, it's possible for a Java class to obtain the names of all its members and display them.
The ability to examine and manipulate a Java class from within itself may not sound like very much, but in other programming languages this feature simply doesn't exist. For example, there is no way in a Pascal, C, or C++ program to obtain information about the functions defined within that program.
One tangible use of reflection is in JavaBeans, where software components can be manipulated visually via a builder tool. The tool uses reflection to obtain the properties of Java components (classes) as they are dynamically loaded.
简单来说就是:
对于一个未知的对象,我们调用一下反射的API,就可以在运行时修改方法、类、接口的行为。
程序运行时,java 系统会一直对所有对象进行所谓的运行时类型识别,这项信息记录了每个对象所属的类。通过专门的类可以访问这些信息。用来保存这些信息的类是Class类,Class类为编写可动态操纵的Java代码程序提供了强大功能.
Class类的实例代表一个运行中Java程序的类或接口。枚举是类的一种,注解是接口的一种,每个数组同样也属于一个 被反射为 Class对象的类。Java原始数据类型和void关键字也被视为Class对象。Class类没有公开构造函数,当类被装载,并且在类加载器中被 定义Class 的方法调用时,Class对象会被被JVM自动构建。
综上,总结一下,如果面试时,问你:简单说一下反射机制/反射是什么,你该怎么回答呢?
反射是Java语言中专有的特性。
在Java程序运行时,获取编译以后的类的字节码文件对象,也就是Class类。 (xxx.class字节码文件在读入内存后,类加载器会生成一个java.lang.Class对象,也就是字节码文件对象)。
对于任意一个Class类,都能直接得到这个类的全部部分,包括它的构造器对象、成员变量对象、成员方法对象。
我们把这种 运行时 获取类信息 以及 动态调用类中成分的 能力 称为 Java的反射机制。
只有我们获取了Class对象后,才能获取其他信息,因为Class对象就像一个入口。在上面类的加载中也说过。反射的第一步,就是拿到这个类对象。
https://blog.csdn.net/liangwenmail/article/details/120965770
Object类的成员方法,被所有类继承:使用对象的getClass()方法,获取对象的类。即使用对象来获取 该对象对应类的Class对象。
Class类的静态方法,传入类的全路径:Class.forName("xxx")
首先,Java文件编译得到字节码文件(.class文件),接着回顾我们上面说到的类加载知识。当一个程序使用某个类时,若该类还未被加载到内存中,则会将其.class文件加载到内存中,生成一个对应的java.lang.Class对象。
Class类提供了以上几种 获取 一个类的 构造器对象 的API。主要区别就是 拿所有还是拿指定(全部返回数组,指定通过参数类型返回单个);拿公开还是公私都拿。
现在我们获取到 一个类的 构造器对象,那肯定可以通过这个构造器来 new 一个该类的对象。