Java反射机制


什么是反射

在程序的运行状态中,

  • 可以构造任意一个类的对象,
  • 可以了解任意一个对象所属的类,
  • 可以了解任意一个类的成员变量和方法,
  • 可以调用任意一个对象的属性和方法。

这种动态获取程序信息以及动态调用对象的功能称为 Java 语言的反射机制。反射被视为动态语言的关键。

两种表现类型

Java程序中的对象在运行时可以表现为两种类型,即

  • 编译时类型
  • 运行时类型

例如 User user = new Admin(); 这行代码将会生成一个user变量,该变量的编译时类型为User,运行时类型为Admin。

为什么要反射

有时,程序在运行时接收到外部传入的一个对象,该对象的编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序需要在运行时发现对象和类的真实信息,而解决这个问题有以下两种做法:

  • 第一种做法是假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换将其转换成其运行时类型的变量即可。
  • 第二种做法是编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

通过反射机制,在程序运行时,我们可以实现如下的操作:

  • 通过反射获得任意一个类的Class对象,并通过这个对象查看这个类的信息;
  • 通过反射创建任意一个类的实例,并访问该实例的成员;
  • 通过反射机制生成一个类的动态代理类或动态代理对象。

反射常用类概述

  • Class: Class 类的实例表示正在运行的 Java 应用程序中的类和接口;
  • Constructor: 关于类的单个构造方法的信息以及对它的权限访问;
  • Field: Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限;
  • Method: Method 提供关于类或接口上单独某个方法的信息。

字节码文件想要运行都是要被虚拟机加载的,每加载一种类,Java 虚拟机都会为其创建一个 Class 类型的实例,并关联起来。

反射的使用场景

Java 的反射机制,主要用来编写一些通用性较高的代码或者编写框架的时候使用。

通过反射的概念,我们可以知道,在程序的运行状态中,对于任意一个类,通过反射都可以动态获取其信息以及动态调用对象。

例如,很多框架都可以通过配置文件,来让开发者指定使用不同的类,开发者只需要关心配置,不需要关心代码的具体实现,具体实现都在框架的内部,通过反射就可以动态生成类的对象,调用这个类下面的一些方法。

Java的反射机制在实际项目中应用广泛,常见的应用场景有:

  • 使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序;
  • 多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化;
  • 面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC