反射机制和动态代理的原理
反射机制是Java语言提供的一种基础功能,赋予程序在运行时(注意:不是编译时)自省(introspect)的能力。通过反射我们可用直接操作类或者对象,比如获取某个对象类的定义,获取类声明的属性和方法,调用对象的方法或者构造对象,甚至可以在运行时修改类的定义。
反射会额外消耗一定的系统资源,还可以忽略权限检查,可能会破坏系统封装性产生安全问题。
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如包装RPC调用、面向切面编程(AOP)等。
实现动态代理的方式很多,比如JDK自身提供的动态代理,它是利用Java自带的反射机制来实现的。还有其他实现方式,比如利用更高性能的字节码操作机制,ASM、cglib(基于ASM)、Javassist等 。
JDK动态代理的优势:
1、最小化依赖关系,减少依赖意味着简化开发和维护,JDK本身的支持可能比cglib更可靠。
2、平滑升级JDK
3、代码实现简单
cglib的优势:
1、侵入性低,直接对实现类进行代理,无需依赖接口。
2、高性能
动态代理的应用非常广泛,虽然最初多是因为RPC等的使用进入我们的视线,但是动态代理的应用场景远不如此,它符合AOP等切面编程。可以看做是对OOP的补充,因为OOP对于跨越不同对象或类的分散、纠缠逻辑表现力不够,比如在不同模块的特定阶段做一些事情,类似日志、用户鉴权、异常处理、性能监控、事务处理、资源释放等等。
AOP通过动态代理机制可以让开发者从这些琐碎的事情从抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如Facade、Observer等很多设计目的,都可以通过动态代理优雅地实现。
上一篇: 走出类加载器迷宫