Java 反射机制-Reflection
作者:互联网
部分内容来自黑马程序员和JavaGuide,可以先了解一下类加载和类加载器的知识。
1 反射机制
1.1 【面试】 说说你对反射的了解?
来自文档的解释:
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.
简单来说就是:
- 反射是Java编程语言中的一个特色。
- 它允许一个正在执行的Java程序来 检验 或者 “反省” 自己,并且操作程序的内部属性。
- 好比说,一个Java类可以获取它所有成员的名字并进行展示。
- 这在C、C++、Pascal其他语言里面根本做不到。
- 反射机制的一个实用例子就是JavaBeans,软件的各个组件可以通过 构建工具来可视化地操作。
- 这个工具使用反射来获取Java类的属性————当他们被动态地加载时。
- 这张图就很简单明了:
对于一个未知的对象,我们调用一下反射的API,就可以在运行时修改方法、类、接口的行为。
- 反射的工作机制:
程序运行时,java 系统会一直对所有对象进行所谓的运行时类型识别,这项信息记录了每个对象所属的类。通过专门的类可以访问这些信息。用来保存这些信息的类是Class类,Class类为编写可动态操纵的Java代码程序提供了强大功能.
- Class类:
Class类的实例代表一个运行中Java程序的类或接口。枚举是类的一种,注解是接口的一种,每个数组同样也属于一个 被反射为 Class对象的类。Java原始数据类型和void关键字也被视为Class对象。Class类没有公开构造函数,当类被装载,并且在类加载器中被 定义Class 的方法调用时,Class对象会被被JVM自动构建。
综上,总结一下,如果面试时,问你:简单说一下反射机制/反射是什么,你该怎么回答呢?
反射是Java语言中专有的特性。
在Java程序运行时,获取编译以后的类的字节码文件对象,也就是Class类。 (xxx.class字节码文件在读入内存后,类加载器会生成一个java.lang.Class对象,也就是字节码文件对象)。
对于任意一个Class类,都能直接得到这个类的全部部分,包括它的构造器对象、成员变量对象、成员方法对象。
我们把这种 运行时 获取类信息 以及 动态调用类中成分的 能力 称为 Java的反射机制。
1.2 【面试】反射能干什么?
(1) 获取一个类的Class对象 所有行为的第一步
只有我们获取了Class对象后,才能获取其他信息,因为Class对象就像一个入口。在上面类的加载中也说过。反射的第一步,就是拿到这个类对象。
https://blog.csdn.net/liangwenmail/article/details/120965770
- 通过类名.class获取,这里的class是Java的关键字。不止对引用类型,基本类型也可以使用。https://www.zhihu.com/question/47002542
-
Object类的成员方法,被所有类继承:使用对象的getClass()方法,获取对象的类。即使用对象来获取 该对象对应类的Class对象。
-
Class类的静态方法,传入类的全路径:Class.forName("xxx")
首先,Java文件编译得到字节码文件(.class文件),接着回顾我们上面说到的类加载知识。当一个程序使用某个类时,若该类还未被加载到内存中,则会将其.class文件加载到内存中,生成一个对应的java.lang.Class对象。
(2) 获取一个类的构造器对象 Constructor类
Class类提供了以上几种 获取 一个类的 构造器对象 的API。主要区别就是 拿所有还是拿指定(全部返回数组,指定通过参数类型返回单个);拿公开还是公私都拿。
现在我们获取到 一个类的 构造器对象,那肯定可以通过这个构造器来 new 一个该类的对象。
标签:反射,Java,Reflection,对象,class,获取,Class 来源: https://www.cnblogs.com/80sVolxxxx/p/16614522.html