反射机制和动态代理的原理

反射机制是Java语言提供的一种基础功能,赋予程序在运行时(注意:不是编译时)自省(introspect)的能力。通过反射我们可用直接操作类或者对象,比如获取某个对象类的定义,获取类声明的属性和...

反射机制是Java语言提供的一种基础功能,赋予程序在运行时(注意:不是编译时)自省(introspect)的能力。通过反射我们可用直接操作类或者对象,比如获取某个对象类的定义,获取类声明的属性和方法,调用对象的方法或者构造对象,甚至可以在运行时修改类的定义。

 

反射会额外消耗一定的系统资源,还可以忽略权限检查,可能会破坏系统封装性产生安全问题。

 

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如包装RPC调用、面向切面编程(AOP)等。

 

实现动态代理的方式很多,比如JDK自身提供的动态代理,它是利用Java自带的反射机制来实现的。还有其他实现方式,比如利用更高性能的字节码操作机制,ASMcglib(基于ASM)、Javassist等 。

 

JDK动态代理的优势:

1、最小化依赖关系,减少依赖意味着简化开发和维护,JDK本身的支持可能比cglib更可靠。

2、平滑升级JDK

3、代码实现简单

 

cglib的优势:

1、侵入性低,直接对实现类进行代理,无需依赖接口。

2、高性能

 

动态代理的应用非常广泛,虽然最初多是因为RPC等的使用进入我们的视线,但是动态代理的应用场景远不如此,它符合AOP等切面编程。可以看做是对OOP的补充,因为OOP对于跨越不同对象或类的分散、纠缠逻辑表现力不够,比如在不同模块的特定阶段做一些事情,类似日志、用户鉴权、异常处理、性能监控、事务处理、资源释放等等。

 

AOP通过动态代理机制可以让开发者从这些琐碎的事情从抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如FacadeObserver等很多设计目的,都可以通过动态代理优雅地实现。

  • 发表于 2019-04-16 16:20
  • 阅读 ( 125 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除