概述
- JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- 动态获取类中信息,就是java反射 ,可以理解为对类的解剖。
原理
- 以Tomcat为例,它对外提供了一个接口是,servlet,我们在写程序的时候可以继承这个接口
- 可是我们怎么让Tomcat识别我们的程序那,在Tomcat里new 一个?
- 我们把我们程序的配置信息写在配置文件中,这样Tomcat就可以识别我们的程序了
反射机制
- 使用 Java 反射机制可以在运行时期检查 Java 类的信息,
- 检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情
- 通过获取类的信息你可以获取以下相关的内容:
Class对象
- 要想要对字节码文件进行解剖,必须要有字节码文件对象,如何获取字节码文件对象呢?
- 第一种方式:
- Object类中的getClass()方法的
- 必须要明确具体的类,并创建对象,太麻烦
1 | public static void getClassObject_1(){ |
- 第二种方式:
- 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
- 相对简单,但是还是要明确用到类中的静态成员,还是不够扩展
1 | public static void getClassObject_2() { |
- 第三种方式
- 可使用Class类中的 forName() 方法完成
- 只要通过给定的类的 字符串名称就可以获取该类,更为方便,扩展性更强
1 | public static void getClassObject_3() throws ClassNotFoundException { |
构造函数
- 早期:使用 new 的时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
- 并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象
1 | cn.java.bean.Person p = new cn.java.bean.Person(); |
- 现在:
1 | String name = "cn.java.bean.Person"; |
- 当获取指定名称对应类中的所体现的对象时, 而该对象初始化不使用空参数构造该怎么办呢?
- 既然是通过指定的构造函数进行对象的初始化, 所以应该先获取到该构造函数。
- 通过字节码文件对象即可完成。
- 该方法是:getConstructor(paramterTypes);
1 | String name = "cn.java.bean.Person"; |
字段
1 | public static void getFieldDemo() throws Exception { |
方法
- 获取指定Class中的所有公共函数
1 | public static void getMethodDemo() throws Exception { |
- 获取指定Class中的指定空参方法
1 | public static void getMethodDemo_2() throws Exception { |
- 获取指定Class中指定有参方法
1 | public static void getMethodDemo_3() throws Exception { |
演示类(Person)
1 | package cn.java.bean; |
练习
- 需求:简易模拟电脑运行,需要声卡和网卡
- 因为后期可能有各种设备,所以创建接口,让设备继承接口
1 | //接口 |
- 模拟主板
1 | public class Mainboard { |
- 每次添加设备都要修改代码传递新对象吗?可以不修改代码完成该动作吗?
- 创建一个配置文件,包含着各设备信息,主类中调取并实现创建对象的动作
1 | public class ReflectTest { |