欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-07 10:05:30
...

反射机制是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等很多设计目的,都可以通过动态代理优雅地实现。

相关标签: java 动态代理