概述
反射是框架设计的灵魂,框架是半成品的软件。只有理解了反射,才能理解框架。
反射机制:将类的各个组成部件封装为其他对象。
反射的好处
- 可以在程序运行的过程中,操作这些对象。
例如:IDEA在你敲代码时会给你提示,本质就是用到了反射,
- 可以解耦,降低程序的耦合性,提高程序的可扩展性。
反射相关API的操作
Java之中,一切皆对象,哪怕是一个类的变量、方法也都是一种对象。
Class对象的获取方式
共有三种方式,分别对应上述三个阶段
源代码阶段
Class.forName(“全类名(包名+类型)”):将字节码文件加载进内存,返回Class对象。多用于配置文件中,读取文件,加载类。
类对象阶段
类名.class:字节码文件已加载进内存,通过类名的class属性来获取。多用于参数的传递。
运行时阶段
对象.getClass():已经有具体的对象,getClass方法在Object中,任何类都有。多用于对象获取字节码的方式。
同一个字节码文件在一次程序运行过程中,只会被加载到内存一次,无论通过哪一种方式获取的Class对象都是同一个对象。
Class对象功能
Field、Constructor、Method不带Declared只能获取public的,带Declared可以获取全部限定名的,都可以使用暴力反射
获取功能
- 获取成员变量们
- Field的get和set方法可以直接获取和修改成员变量的值,加上setAccessible(true)暴力反射可以忽略权限
- 获取构造方法们
构造器用来创建对象,newInstance方法用来创建对象。
- 获取成员方法们
- 获取类名
反射实例
例:写一个框架,可以创建任意类的对象,并且执行其中的任意方法,框架一旦写好,就不能再修改。
实现:
- 配置文件
- 反射
步骤:
将需要创建对象的全类目和需要执行方法定义在配置文件中
在程序中加载配置文件
使用反射技术加载文件进内存
创建对象
获取方法对象
执行方法
因为配置文件仅仅是一个物理文件,随便改没有任何影响。而如果每次都改代码,就每次都要重新编译,在项目庞大的情况下耗时巨大。
个人理解我们通常思维是先定义类,再写类中的变量、方法,然后new出一个实例,再调用、执行…
而反射则是先给定用哪个类,然后倒回去…这有利于我们实现对多种不同类的功能的操作。