来,免费送你一张spring全家桶绿卡!!!

时间:2019-09-10 10:30:02 来源:中国防水保温网 当前位置:贱笑了www.yabovip17.com亚搏体育 > 查询 > 手机阅读

世界上没有奇迹,只有专注和聚焦的力量!


今天简单整理一下java中一个非常核心的技术点---反射。有java编码基础的童鞋可能都知道反射就是在运行时通过类名动态加载类进入JVM,并且可以通过加载的类创建实例。

可能这种技术有哪些经典的应用呢?或者有哪些需要注意的地方?

来,免费送你一张spring全家桶绿卡!!!

基于反射的动态代理技术让设计模式更灵活

  1. 代理模式更灵活,代理模式和模板模式我再一篇悟空问答中有比较详解的整理,大家不妨去看看,核心接口InvocationHandler,有了反射不在需要显示的生命代理对象,通过InvocationHandler接口获取代码量更少也更为灵活。
  2. 装饰模式,spring中很多增强器的实现方式之一。基于反射,通过对基础类的增强添加需要的动作,行为等,比如CGlib的动态代理。看过sping源码的童鞋可能都知道,增强器一词在源码中频繁出现,它就是反射技术下的装饰模式。
  3. 模板模式,在基类中定义算法或者流程的骨干,然后将核心的具体实现延迟到子类中,各个子类实现其差异化的部分。在反射的基础上,基类不在需要一个抽象类,子类实现的方法更灵活。可以利用约定俗称的变量或者方法名,通过反射区判断,动态执行子类的实现了的方法(不会再限定子类必须实现基类的所有抽象方法)。
来,免费送你一张spring全家桶绿卡!!!

简单写个例子

一些额外的点,也很重要

直接上干货!大家在使用过程中多注意以下几点:

  1. 访问属性或者方法时,注意设置Accessible设置为true;Accessible是用来判断该方法或者属性在invoke调用的时候是否需要安全检查,而频繁的安全检查对系统的性能影响非常大(低能的操作),所以允许开发者通过Accessible属性避过安全检查,有统计指出,将Accessible设置为true可以将程序性能提升20倍以上。
  2. forName的作用只是加载类文件到JVM中,不做任何其他事,如果该类中存在静态代码块,那么在调用forName的时候该静态代码块的内容将被执行(这个过程和普通类的加载完全一致)。
  3. 无法直接动态加载数组,数组在编译时会生成其相对应的类,直接加载该类可以动态加载数组。
  4. 反射同动态代理的关系;java的反射机制是动态代理的底层支撑,spring框架中很多代码增强器的实现方式都是借助于反射,比如AOP。
  5. 动态代理又分为两种实现方式,jdb框架本身的基于接口的代理方式+cglib基于继承和方法拦截器的代理。默认有接口存在使用JDK代理,没有接口使用后者。
  6. 反射效率低是个真命题,但是因为效率低而放弃使用它是个假命题。反射在很多地方能够大幅度降低代码复杂度。使得代码有更好的可读性和友好性。
来,免费送你一张spring全家桶绿卡!!!

搞懂反射以及其应用,轻松读spring全家桶源码。

欢迎关注大狂客,持续分享编程干货,知识拉近你我,分享让知识无界!

查询本月排行

查询精选