Java是哦一种静态的强类型语言,但是基于反射的机制,也具备了一些动态类型语言的能力
那么动态代理是基于反射实现的吗?
反射机制是Java语言提供的一种基础能力,赋予了程序在运行时候自省的能力,反射可以直接操作类或者对象,甚至修改类的定义
动态代理则是一种方便运行时动态构建代理,处理代理方法的机制,很多场景都是利用类似机制做到的
但是实现动态代理的方式很多,比如JDK自身提供的动态代理,还有些其他机制可以获取,例如ASM cglib Javassist
关于java的反射不必多说,就是操控Class Field Method Constructor等
这些都是一些基本的编程,对于反射中所谓的accessible可以理解为修饰成员的public hprotected private ,修改访问限制
setAccessible的场景可以在Java实体类中,反射生成getter setter方法
在Java9之后,这个方法的使用会存在一些争议
所以加入了Open的概念,就是只有被设置的类可以进行反射调用,不然就被认为是不合法的illegal
这个被限制者方可反射的特性正在逐步的加入Java中
然后是动态代理,什么是动态代理,是否是一个对被调用着的包装,我们是否可以看做是装饰器模式的应用
通过动态代理,方便我们在实际的业务中引入一些非业务相关
对于简单的JDK代理,可以简化为如下
上面是简单的JDK的实现 ,有一个局限在于,JDK的方式只能支持接口的实现
而cglib,则不需要依赖于接口
cglib则是直接创建子类化
两者的优缺点呢?
JDK呢?
最小化依赖关系,简化开发和维护,JDK的支持,比cglib
平滑进行JDK的生成
代码实现相对简单
cglib
调用 目标可能不便实现额外的接口,限定接口比较入侵式,如果使用cglib动态代理就没有这种限制
值操作关心的类
高性能
虽然之前说得JDK的性能不如cglib
但是JDK本身得到了很多的改善,已经不再完全是反射了,同样适用了ASM进行操作
动态代理的应用很广泛,因为完美的切换了AOP等编程需求
AOP代理让开发人员从繁琐事务抽身,提高了代码的抽象和复用,可以优雅实现一些设计目的