Java教程

Java 反射机制-Reflection

本文主要是介绍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

  1. 通过类名.class获取,这里的class是Java的关键字。不止对引用类型,基本类型也可以使用。https://www.zhihu.com/question/47002542

  1. Object类的成员方法,被所有类继承:使用对象的getClass()方法,获取对象的类。即使用对象来获取 该对象对应类的Class对象

  2. Class类的静态方法,传入类的全路径:Class.forName("xxx")

首先,Java文件编译得到字节码文件(.class文件),接着回顾我们上面说到的类加载知识。当一个程序使用某个类时,若该类还未被加载到内存中,则会将其.class文件加载到内存中,生成一个对应的java.lang.Class对象。

(2) 获取一个类的构造器对象 Constructor类

Class类提供了以上几种 获取 一个类的 构造器对象 的API。主要区别就是 拿所有还是拿指定(全部返回数组,指定通过参数类型返回单个);拿公开还是公私都拿。
现在我们获取到 一个类的 构造器对象,那肯定可以通过这个构造器来 new 一个该类的对象。

这篇关于Java 反射机制-Reflection的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!