一 概述
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
- 反射就是把java类中的各种成分映射成一个个的Java对象
应用场景:程序在运行时接收到外部传入的一个对象,该对象在编译时类型是Object,但程序又需要调用该对象运行时的类型的方法。
为了解决这个问题,程序需要在运行时发现对象和类的真实信息。解决该问题有以下两个做法。
- 第一种做法是假设在编译时和运行时的都完全知道类型的真实信息。在这种情况下,可以先使用instanceof运算符进行判断,在利用强制类型转换成成运行时类型的变量即可。
- 第二种做法在编译时期无法预知该对象和类可能属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。
二 获得Class对象的三种方式
- 使用Class类的forName(String className)静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的权限定类名(必须添加完整包名)。
- 调用某个类的class属性来获得某个类对应的Class对象。例如: Person.class将返回Person类对应的Class对象。
- 调用某个对象的getClass()方法。该方法是java.lang.Object类中的一个方法,所以所有的Java对象都可以调用该方法,该方法将返回对象所属类对应的Class对象。
第一种方式和第二种方式都是直接根据类来取得该类的Class对象,相比之下,第二种方式有如下两种优势。
- 代码更安全。程序在编译阶段就可以检查需要访问的Class对象是否存在。
- 程序性能更加安全。因为无需调用方法,所以性能更好。
三 实现反射的步骤
一个小demo