如何理解反射

简介: 反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

何谓反射?

如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射的优缺点?

反射可以让我们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利。

不过,反射让我们在运行时有了分析操作类的能力的同时,也增加了安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。

反射的应用场景?

像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。但是!这并不代表反射没有用。相反,正是因为反射,你才能这么轻松地使用各种框架。像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。

这些框架中也大量使用了动态代理,而动态代理的实现也依赖反射。

比如下面是通过 JDK 实现动态代理的示例代码,其中就使用了反射类 Method 来调用指定的方法

public class DebugInvocationHandler implements InvocationHandler {

   /**

    * 代理类中的真实对象

    */

   private final Object target;

 

   public DebugInvocationHandler(Object target) {

       this.target = target;

   }

 

   public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {

       System.out.println("before method " + method.getName());

       Object result = method.invoke(target, args);

       System.out.println("after method " + method.getName());

       return result;

   }

}

另外,像 Java 中的一大利器 注解 的实现也用到了反射。

为什么你使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?

这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理

相关文章
|
消息中间件 边缘计算 物联网
物联网络管理平台(LoRaWAN)介绍|学习笔记
快速学习物联网络管理平台(LoRaWAN)介绍
1080 5
物联网络管理平台(LoRaWAN)介绍|学习笔记
|
测试技术 API 微服务
性能测试并发量评估新思考
性能测试并发量评估新思考
499 20
性能测试并发量评估新思考
|
测试技术 持续交付 微服务
深入理解微服务架构:从概念到实践
深入理解微服务架构:从概念到实践
236 20
|
负载均衡 Cloud Native 持续交付
云原生时代的微服务架构:优势、挑战与实践
云原生时代的微服务架构:优势、挑战与实践
254 20
|
负载均衡 Java 云计算
微服务架构下的服务治理与容错机制
微服务架构下的服务治理与容错机制
216 20
|
Kubernetes Linux Docker
容器化技术Docker入门与实践
容器化技术Docker入门与实践
189 20
|
供应链 智能硬件
|
传感器 运维 监控
初体验物联网场景
初体验物联网场景
初体验物联网场景
|
监控 安全 数据可视化
JAVA版智慧工地源码,PC、移动、数据可视化大屏端源码,支持二开
智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
下一篇
oss云网关配置