什么是反射?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它任意一个方法和属性。这种动态获取类信息以及动态调用对象方法的功能称为Java语言的反射机制。
哪里用到反射机制?
- JDBC中,利用反射动态加载了数据库驱动程序。
- Eclispe、Idea等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
- 很多框架都用到反射机制,注入属性,调用方法,如Spring、Mybatis
反射机制的优缺点?
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:
- 对性能有影响,这类操作总是慢于直接执行java代码。
- 相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)
为什么Java反射效率不高?
- Method#invoke 方法会对参数做封装和解封操作
- 需要检查方法可见性
- 需要校验参数
- Method#invoke 就像是个独木桥一样,各处的反射调用都要挤过去,在调用点上收集到的类型信息就会很乱,影响内联程序的判断
- JIT 无法优化。由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射式操作的性能比非反射式操作要慢
Java反射机制的作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
如何使用Java的反射?
请看该篇文章【Java反射机制】
实现Java反射相关的类
- Class:表示正在运行的Java应用程序中的类和接口, 所有获取对象的信息都需要Class类来实现。
- Field:提供有关类和接口的属性信息,以及对它的动态访问权限。
- Constructor:提供关于类的单个构造方法的信息以及它的访问权限
- Method:提供类或接口中某个方法的信息
反射使用步骤(获取 Class 对象、调用对象方法)
- 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。
- 调用 Class 类中的方法,既就是反射的使用阶段。
- 使用反射 API 来操作这些信息。