【Java面试题】一分钟了解反射机制
什么是反射
反射是指在java程序运行过程中可以获取到任意一个类的属性和方法,还能调用任意一个对象的内部方法和属性。
反射的优点
- 灵活性和动态性:反射可以在程序运行过程中动态的加载类,创建对象,调用方法,访问字段。可以根据实际需求动态的扩展和适应。提高了代码的灵活性
- 是许多框架的基础:反射是很多Java语言框架的基础(spring/springboot),依赖注入,面向切面编程,注解的解析,这些都离不开反射
- 解耦合和高可用:反射可以通过拷贝通用对象,序列化等方式,降低代码的耦合性,降低模块之间的依赖
反射的缺点
- 安全性:反射可以绕过Java语言的访问控制机制,比如可以 直接访问到private字段,破坏了封装性,可能会导致数据泄露
- 代码复杂:使用反射会使代码变得更加复杂,并且很多错误只有在运行中才能暴露出来
- 性能开销大:反射机制由于需要进行解析等操作,会有一定的性能开销。
反射机制的使用场景
- 依赖注入和控制反转:以spring/springboot为代表的Ioc框架,在启动时会去扫描带有注解的类,并通过反射机制实例化对象,并实现依赖注入
- 注解:注解本身是一个标记,需要有人去读取这些标记,而反射机制就是注解的“读取器”,通过反射机制去读取类,方法,或者字段上是否有注解信息,并根据注解进行相应的逻辑操作
- 动态代理和AOP:实现面向切面编程的常用手段是动态代理,而动态代理的实现是依赖于反射机制的。代理对象在内部调用真实对象的方法时,就是使用 反射机制的Method.invoke方法
- 对象关系映射:比如mybatis框架,将数据库中查出来的一行行数据转化为一个个对象,就是使用反射机制。