概述

反射是框架设计的灵魂,框架是半成品的软件。只有理解了反射,才能理解框架。

反射机制:将类的各个组成部件封装为其他对象。

Java反射原理与 java反射理解_Java反射原理与

反射的好处

  1. 可以在程序运行的过程中,操作这些对象。
    例如:IDEA在你敲代码时会给你提示,本质就是用到了反射,

Java反射原理与 java反射理解_Java反射原理与_02

  1. 可以解耦,降低程序的耦合性,提高程序的可扩展性。

反射相关API的操作

Java之中,一切皆对象,哪怕是一个类的变量、方法也都是一种对象。

Class对象的获取方式

共有三种方式,分别对应上述三个阶段

源代码阶段

Class.forName(“全类名(包名+类型)”):将字节码文件加载进内存,返回Class对象。多用于配置文件中,读取文件,加载类。

类对象阶段

类名.class:字节码文件已加载进内存,通过类名的class属性来获取。多用于参数的传递。

运行时阶段

对象.getClass():已经有具体的对象,getClass方法在Object中,任何类都有。多用于对象获取字节码的方式。

Java反射原理与 java反射理解_配置文件_03

同一个字节码文件在一次程序运行过程中,只会被加载到内存一次,无论通过哪一种方式获取的Class对象都是同一个对象。

Class对象功能

Field、Constructor、Method不带Declared只能获取public的,带Declared可以获取全部限定名的,都可以使用暴力反射

获取功能

  1. 获取成员变量们
  2. Java反射原理与 java反射理解_反射_04

  3. Field的get和set方法可以直接获取和修改成员变量的值,加上setAccessible(true)暴力反射可以忽略权限
  4. 获取构造方法们
  5. Java反射原理与 java反射理解_Java_05

构造器用来创建对象,newInstance方法用来创建对象。

  1. 获取成员方法们
  1. 获取类名

反射实例

例:写一个框架,可以创建任意类的对象,并且执行其中的任意方法,框架一旦写好,就不能再修改。

Java反射原理与 java反射理解_加载_06

实现:

  1. 配置文件
  2. 反射

步骤:

  1. 将需要创建对象的全类目和需要执行方法定义在配置文件中

  2. 在程序中加载配置文件

  3. 使用反射技术加载文件进内存

  4. 创建对象

  5. 获取方法对象

  6. 执行方法

Java反射原理与 java反射理解_Java_07

为什么推荐使用配置文件?

因为配置文件仅仅是一个物理文件,随便改没有任何影响。而如果每次都改代码,就每次都要重新编译,在项目庞大的情况下耗时巨大。

个人理解

我们通常思维是先定义类,再写类中的变量、方法,然后new出一个实例,再调用、执行…

而反射则是先给定用哪个类,然后倒回去…这有利于我们实现对多种不同类的功能的操作。